2

次のコードを考えてみましょう (遊び場で):

// 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-> 使用しても安全と思われます。

それでもこのエラーがあります。その理由と回避策は何ですか?

4

2 に答える 2

6

を呼び出すとis_even、この関数に所有権が与えられます

丁度。所有権を譲渡しました。あなたはもうそれを持っていません、そして関数はそれが望むことをします。この場合、メモリが解放されるため、呼び出し後に使用することはできません

その関数はもはや所有権を必要としません

それがドロップされる理由です。

これは、所有権の不変 (読み取り専用) の譲渡です。

それは存在しません。所有権を完全に譲渡します。中途半端なことはありません。

削除されていないことを確認してください

実際、それは解放されていると確信しており、それは非常に良いことです。Rust がそれを管理してくれるので、「誰がこれを解放すべきか?」と尋ねる必要はありません。

それで、どうやってそれを修正しますか?それは簡単です: ボックス全体ではなく、内部の値への参照を渡します。これは値を借用し(変更可能かどうかはあなた次第)、所有権は譲渡されません。

fn is_even(nbr: &i32) -> bool { ... }
于 2015-09-02T12:20:54.023 に答える