Изменчивость в Rust следует за именем, а не за значением. Поэтому, если у вас есть значение, которое связано с изменяемой переменной, и вы хотите, чтобы оно было неизменным, все, что вам нужно сделать, это перепривязать его:
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`
}
Привязка значения к тому же имени с другим изменчивость распространена (см. Что делает 'let x = x' в Rust? ).
Вы также можете поместить исходную привязку в выражение блока, чтобы минимизировать область действия 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
};
}
BufRead::read_line
определяется таким образом, что вам не нужно выделять новый String
для каждой новой прочитанной строки. Метод должен принимать &mut
, потому что он может увеличить строку. Хотя вы можете перебирать строки ввода с помощью stdin().lines()
, что приводит к владению String
s, нет стандартной функции ввода-вывода, которая читает одну строку из stdin и возвращает String
(которую можно просто привязать к переменная не mut
). Конечно, если вы делаете это много, вы можете просто написать свою собственную функцию, которая содержит mut
и возвращает, например, io::Result<String>
.