Я изучаю Rust из Книга Rust Programming Language , доступная в No Starch Press , но столкнулась с проблемой, когда компилятор не вел себя так, как описано в книге в главе 4 оп.77.
Глава 4 книги обсуждает право собственности, а пример на с.77 похоже на это без финального println!()
в main()
(я также добавил комментарии и функцию из стр. 76 для создания MCVE). Я также создал игровую площадку .
fn main() {
let mut s = String::from("Hello world!");
let word = first_word(&s);
// according to book, compiler should not allow this mutable borrow
// since I'm already borrowing as immutable, but it does allow it
s.clear();
// but of course I do get error here about immutable borrow later being
// used here, but shouldn't it have errored on the clear() operation before
// it got here?
println!("First word of s is \"{}\"", word);
}
// return string slice reference to first word in string or entire string if
// no space found
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
}
&s[..]
}
Я понимаю, почему компилятор выдает ошибку там, где в данный момент это происходит.Но, насколько я понимаю из книги, это должно вызвать ошибку компилятора, когда я пытался очистить строку, потому что я не могу заимствовать s
как изменяемый, потому что он также заимствован как неизменяемый, таким образом исключая возможностьошибка, которую я получил (то есть, она не должна компилироваться даже без мой последний println!()
).Но он прекрасно скомпилируется для меня, пока я не пытаюсь использовать ссылку на word
после операции clear()
.
Книга использует Rust 1.21.0 ( см. стр. 2), хотя я использую Rust 1.31.0 - так что это скорее всего изменение, внесенное в компилятор, но я пытаюсь понять почему .Почему лучше ошибаться, чем в настоящее время, по сравнению с тем, что в книге сказано, что это будет ошибкой?
Чтобы было ясно, я понимаю сами ошибки. Я пытаюсь понять, почему это не так.не выдает ошибку компилятора в том месте, в котором говорится, что книга должна это сделать (то есть, почему изменилось поведение компилятора?).