Rust`array.each`参数中使用了什么类型的指针?

时间:2013-04-28 17:41:37

标签: rust

鉴于此Rust示例(found here):

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的{​​{1}}参数是什么类型的指针?

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

如何循环通过~并将每只狗分配给变量名dogs而不破坏唯一拥有(dog)指针的规则?

在这种情况下~ Rust 参考 (因此允许其他名称代表借来的指针)?如果是这样,我们如何知道? Rust References应该使用dog语法,不是吗?

2 个答案:

答案 0 :(得分:8)

如您所料,这是一个参考。在闭包中,dog的类型为&~Dog,这意味着对指向Dog的唯一智能指针的引用。

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

您不必使用dog注释&的原因是类型推断:Rust编译器知道each的类型,因此您不必在闭包中写下&

答案 1 :(得分: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

您还可以从signature of core::vec::each

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

这表明如果我们提供[T],将使用&T类型的参数调用该函数。