次のコードを考えてみましょう (遊び場で):
// 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
-> 使用しても安全と思われます。
それでもこのエラーがあります。その理由と回避策は何ですか?