鉴于此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));
}
}
Run Code Online (Sandbox Code Playgroud)
什么类型的指针是dog
参数.each
?
dog
变量的声明似乎打破了唯一拥有指针(~
)一次只能有一个名称的规则.
如何dogs
在dog
不破坏unique owned(~
)指针规则的情况下循环并将每个狗分配给变量名称?
被dog
一个锈病参考在此情况下(从而允许另一名表示借用的指针)?如果是这样,我们怎么知道?Rust References应该使用&
语法,不是吗?
小智 8
如您所料,这是一个参考.在闭包中,dog
is 的类型&~Dog
,表示对a的唯一智能指针的引用Dog
.
唯一智能指针的规则并不是只有一种方法来访问数据; 相反,它是每个唯一的智能指针是它指向的数据的唯一直接引用.你仍然可以有多个引用,以独特的智能指针.
为什么你没有注释的原因dog
有&
是由于类型推断:锈编译器知道的类型each
,所以你不必写&
在封闭.