Рассмотрим следующий код (on playground):Почему я не могу спрятать коробку?
// calling this function move the ownership of nbr to is_even
// at the end of the function is_even doesn't give the ownership back
fn is_even(nbr: Box<i32>) -> bool {
*nbr % 2 == 0
}
fn main() {
let integer = Box::new(42);
if is_even(integer) {
print!("is even ");
}
println!("{}", integer);
}
Я получаю следующее сообщение об ошибке:
example.rs:10:17: 10:24 error: use of moved value: `integer` [E0382]
example.rs:10 println!("{}", integer);
example.rs:7:13: 7:20 note: `integer` moved here because it has type `Box<i32>`, which is non-copyable
example.rs:7 if is_even(integer) {
Я не понимаю, почему. Хорошо, когда я звоню is_even
, я даю право собственности на эту функцию, но в конце is_even
эта функция больше не нуждается в собственности. Это непреложная (только для чтения) передача права собственности, поэтому мы уверены, что она не удаляется, когда main
сдерживается integer
-> кажется безопасным использовать его обратно.
Все еще есть эта ошибка. Почему и что такое обходной путь?
Этот и другие смешные вещи ржавчины - так что я теоретизирую - связанные с тем, как они подходят к вещам. Теперь, очевидно, is_even() может работать с семантикой, которую вы предлагаете. Тем не менее, другая реализация is_even(), которая передавала бы аргумент некоторым другим функциям, которые могут или не могут сохраняться или меняться, или обрабатывать их в других потоках, изменят семантику. Не уверен, что мое объяснение верное, но именно так я объясняю это неинтуитивное поведение для себя. – BitTickler
@BitTickler: это в основном это, да. Если вы передадите аргумент как «Box», то вы * отдаете его *, а функция 'is_even' свободна в том, чтобы мутировать его, передавать его и делать то, что он хочет, уверенный, что функция' main' isn он не сможет использовать его после завершения функции. –