Все входные данные должны быть изменяемыми в Rust? - PullRequest
1 голос
/ 15 февраля 2020

Я хотел ввести значение и присвоить его переменной, которая должна быть неизменной (должна быть). Как я могу это сделать?

В настоящее время я делаю это:

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 выдает ошибку: types differ in mutability. Если я удаляю mut из декларации, я получаю ошибку, подобную этой:

error[E0308]: mismatched types
 --> src/main.rs:5:27
  |
5 |     io::stdin().read_line(&nth_term).expect("I/O error");
  |                           ^^^^^^^^^ types differ in mutability
  |
  = note: expected mutable reference `&mut std::string::String`
                     found reference `&std::string::String`

Как я могу получить что-то вроде этого:

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

Я пытался , читая официальный документация, первые несколько глав, но напрасно.

1 Ответ

2 голосов
/ 15 февраля 2020

Изменчивость в 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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...