Привет, ЛОР. Сразу попрошу камнями не кидаться, ибо за плечами 5 лет Java разработки, возможно она и накладывает такой отпечаток на восприятие нового языка. Энивей, ближе к делу. Читаю их оффициальную книгу и есть там такой пример
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
Как я это вижу:
let mut guess = String::new();
let guess = String::new();
Это же звучит как «Создает иммутабельную ссылку на иммутабельный объект», т.е. нельзя поменять то, куда она указывает, равно как и значение по ней (нельзя вызвать guess.push('c');)
let guess = &mut String::new();
А вот это просто вишенка на торте, а может быть и сам торт. Создаёт иммутабельную ссылку на мутабельный объект. Т.е. мы не можем поменять то, куда оно указывает, но можем изменять значение (вызовом того же guess.push('c');) Если описывать последнее терминами раста, то создаёт иммутабельный биндинг на мутабельную ссылку.
И если я понял это правильно, то у меня вопрос, почему в примере книги написано вот так?
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
Ибо мне как джависту очень хочется написать вот так
let guess = &mut String::new();
io::stdin().read_line(guess)
.expect("Failed to read line");