3

この Rust の例を考えると (ここにあります):

struct Dog {
    name: ~str
}

fn dogshow() {
    let dogs: [~Dog * 3] = [
        ~Dog { name: ~"Spot"   },
        ~Dog { name: ~"Fido"   },
        ~Dog { name: ~"Snoopy" },
    ];

    // let winner: ~Dog = dogs[1]; // this would be a compile time error.
                                   // can't assign another name to a 
                                   // uniquely owned (`~`) pointer.

    for dogs.each |dog| {  // WTF? `dog` is a second pointer to dogs[x]. 
                           // That's not supposed to be allowed by `~` pointers.
                           // why is this not a compile time error?
        println(fmt!("Say hello to %s", dog.name));
    }
}

dogのパラメータはどの型のポインタ.eachですか?

変数の宣言は、一意に所有されたポインター ( ) が一度に 1 つの名前しか持てないdogという規則に違反しているようです。~

一意に所有される ( ) ポインターの規則を破ることなく、ループを介してdogs各犬を変数名に割り当てるにはどうすればよいでしょうか?dog~

dogこの場合、Rust参照ですか(したがって、別の名前で借用ポインタを表すことができます)? もしそうなら、どうすればわかりますか?Rust 参照は&構文を使用する必要がありますよね?

4

2 に答える 2

8

ご想像のとおり、参考になります。クロージャでは、 の型はdogis です&~Dog。これは、 への一意のスマート ポインタへの参照を意味しますDog

一意のスマート ポインターのルールは、データにアクセスする方法が 1 つしかないということではありません。むしろ、各一意のスマート ポインターが、それが指すデータへの唯一の直接参照であるということです。一意のスマート ポインターの複数の参照を引き続き持つことができます。

dogで注釈を付ける必要がなかった理由は&、型推論によるものです。Rust コンパイラは の型を認識しているため、クロージャeachに記述する必要はありません。&

于 2013-04-28T18:18:11.380 に答える
4

チェックする簡単な方法は、コンパイラに の型に関するエラーを出力させることですdog

for dogs.each |dog| {
    let test: int = dog;
    println(fmt!("Say hello to %s", dog.name));
}

これは、dogDog ( &~Dog)の所有ボックスの借用ポインターの型を示しています。

x.rc:20:24: 20:27 error: mismatched types: expected `int` but found `&~Dog` (expected int but found &-ptr)
x.rc:20         let test: int = dog;
                                ^~~
error: aborting due to previous error

次の署名core::vec::eachからも確認できます。

fn each<'r, T>(v: &'r [T], f: &fn(&'r T) -> bool)

これは、 a を指定する[T]と、関数が type の引数で呼び出されることを示しています&T

于 2013-04-28T18:00:29.263 に答える