刚随手写了一个示例,尝试探测编译器检测机制。以下代码在 JAVA/C/C++等众多语言中没有任何问题,即使按照 RUST 的所有权原则,也应该正常。但实际上编译失败了。
struct Dog {
name: String,
}
impl Dog {
fn release(self) {
println!("{}", self.name)
}
}
struct Person {
dog: Dog,
name: String,
}
fn main() {
let mut person = Person {
dog: Dog {
name: String::from("Hamel"),
},
name: String::from("Zoe"),
};
person.dog.release();
for _ in 0..1 {
person.dog = Dog {
name: String::from("Hogge"),
};
}
println!("{} got a new dog: {}", person.name, person.dog.name);
}
以上代码我先通过 Person 关联了 Dog ,随后释放 Person 中的 Dog ,到此 Dog 不再有效,若后续直接调用会编译失败。
我跟着创建一个百分比会执行的 for 循环重新赋值,按理说指针已发生了变更,后续在循环外使用的 Dog 是新建的对象不会有问题。
但事上上编译失败。Rust 的检测器似乎没有认真评估 for 中的条件,认为 loop 至少执行一次,而 for 却不确定。当我把 for 改成 loop ,它确实正常了。
loop {
person.dog = Dog {
name: String::from("Hogge"),
};
break
}
我接着在 loop 中加一个百分比会执行的条件判断,最终仍然失败了。
loop {
if true {
person.dog = Dog {
name: String::from("Hogge"),
};
}
break
}
如果说写 C/C++满脑袋都是寄存器、堆、栈、指针...,那么 RUST 必然是所有权检查器。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.