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

变量的声明dog似乎打破了唯一拥有的指针 ( ~) 一次只能有一个名称的规则。

如何在不破坏唯一拥有的 ( ) 指针规则的情况下循环遍历dogs并将每只狗分配给变量名?dog~

dog在这种情况下是Rust引用(因此允许另一个名称表示借用的指针)?如果是这样,我们怎么知道?Rust 引用应该使用&语法,不是吗?

4

2 回答 2

8

正如您所怀疑的,这是一个参考。在闭包中,dogis的类型&~Dog,表示对 a 的唯一智能指针的引用Dog

唯一智能指针的规则并不是只有一种方法可以访问数据;相反,每个唯一的智能指针都是对其指向的数据的唯一直接引用。您仍然可以对唯一智能指针有多个引用

您不必注释的原因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));
}

这表明 的类型是 Dog ( )dog拥有的盒子的借用指针:&~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 回答