Rust 所有的输入都应该是可变的吗?

Rust 所有的输入都应该是可变的吗?,rust,Rust,我想输入一个值并将其分配给一个不可变的变量(应该是)。我该怎么做 目前,我正在这样做: use std::io; fn main() { let mut a = 0; let mut b = 1; let mut nth_term = String::new(); io::stdin().read_line(&mut nth_term); } 但是如果没有&mut,它会生成一个错误:类型的可变性不同。如果从声明中删除mut,则会出现如下错误: let

我想输入一个值并将其分配给一个不可变的变量(应该是)。我该怎么做

目前,我正在这样做:

use std::io;

fn main() {
    let mut a = 0;
    let mut b = 1;
    let mut nth_term = String::new();
    io::stdin().read_line(&mut nth_term);
}
但是如果没有
&mut
,它会生成一个错误:
类型的可变性不同。如果从声明中删除
mut
,则会出现如下错误:

let input_var = input(); // or some other function that inputs the value and directly assigns it.
错误[E0308]:类型不匹配
-->src/main.rs:5:27
|
5 | io::stdin().读取行(&n项)。预期(“I/O错误”);
|^^^^^^^^^^^^^类型的可变性不同
|
=注意:应为可变引用`&mut std::string::string`
找到引用“%std::string::string”`
我怎么能有这样的东西:

let input_var = input(); // or some other function that inputs the value and directly assigns it.

我试过了,但没有成功。

锈病的易变性跟在名字后面,而不是价值后面。因此,如果您有一个绑定到可变变量的值,并且希望它是不可变的,那么您所要做的就是重新绑定它:

fn main() {
    let mut nth_term = String::new();
    io::stdin().read_line(&mut nth_term).expect("I/O error");
    let nth_term = nth_term;
    //  ^^^^^^^^-- no `mut`
}
将值重新绑定到具有不同易变性的相同名称是很常见的(请参阅)

您还可以将原始绑定放在块表达式中,以最小化
mut
变量的范围:

fn main() {
    let nth_term = {
        let mut nth_term = String::new();
        io::stdin().read_line(&mut nth_term).expect("I/O error");
        nth_term
    };
}
以这种方式定义,这样您就不需要为每一个新行读取分配一个新的
字符串。该方法必须采用
&mut
,因为它可以增长字符串。尽管您可以使用
stdin().lines()
在输入行上迭代,这确实会产生
String
s,但没有标准的I/O函数可以从stdin读取一行并返回
String
(您可以简单地将其绑定到非
mut
变量)。当然,如果您发现自己经常这样做,您可以编写自己的函数,其中包含
mut
,并返回一个
io::Result