鉴于此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
语法,不是吗?
答案 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
类型的参数调用该函数。