自从我学了Rust,就开始了受虐之旅
|
有就是这Rust具备自动类型推断能力,这点挺不错的。 编译吧!咦,居然失败了,错误信息是:cannot borrow `v` as mutable, as it is not declared as mutable Rust编译器:我们把对象分为可变的和不可变的,对于不可变的,一旦创建以后,就不能再改了。那就加个关键字mut,让它变成可变的就可以了:let mut v = Vec::new() 张大胖想起了《effective java》中的一条实践:把可变性限制到最小。他嘴里咕哝着:“嗯,Rust默认是不可变,这个思路也许是对的。” 所有权 他又探索着写下一些代码: 译,又失败了,WTF!到底是怎么回事?这么简单的程序也会出错?! Rust编译器:谁让你手贱!加了一行代码:let v1 = v 张大胖:这有什么关系?在Java中,这就相当于对同一个对象,又添加了一个引用而已! Rust编译器:那是Java,在我Rust这里,你一定要放下Java的执念!要理解一下所有权的问题。 张大胖:什么所有权? Rust编译器:对于任何给定的对象都只有一个绑定与之对应。你用let mut v = Vec::new()就意味着 v 和这个Vector对象绑定了!现在v拥有这个对象的所有权。这一行代码 let v1 = v ,让所有权发生转移了, 现在v1是新主人了。v就不能再访问这个Vector, 我把这种情况叫做“转移语义”。 编译还是出错:‘x’已经有一个不可变借用了,不能再以可变的方式来借用! 张大胖彻底懵逼了!想我叱咤编程界多年,先后学会了C,C++, Java, Ruby ,Python, 从来就没见过这么复杂的语言,这么简单的程序,编译都通不过。 Rust编译器:道理很简单,x1是不可变引用,x2是可变引用,使用x1的"用户"可不希望访问x1时,数据已经改变了。我告诉你一个简单的口诀,以后再遇到问题就迎刃而解了:共享不可变, 可变不共享。
(用严格的描述来说是这样: 同一时刻,要么只有一个可变(&mut)借用,要么有多个不可变(&) 借用,不能同时存在可变和不可变借用。 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



