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