Rust的“& 符号驱动开发”


Rust 中安培尔&符号的含义:想想一个小孩子把最喜欢的玩具借给另一个孩子说:“你可以看,但不能摸。当你完成后,我想要它回来。” 这是共享引用。

(类似appstore中账号和应用下载绑定,如果第二次更新这个app时的账号和初次下载安装这个app账号不一样,会警告你的账号倍屏蔽。)


可变引用 ( &mut variable)
让我们想象一个在给定字符串前添加“hello”的函数,在这种情况下,我们确实希望函数修改它给定的值。在这种情况下,我们需要&mutor可变引用。
想想我们的小孩借一本涂色书给朋友,让他在一页上涂色:“你可以看和摸——但当你完成后,我仍然想要它回来。”

可变引用是独占的.
这是解释有关 Rust 的微妙但非常聪明的部分之一的好地方。
如果某人(或者你的代码的一部分)有一个对某个值的可变引用,Rust 编译器会确保绝对没有其他人可以引用它。为什么?
因为,如果您正在查看某个您认为不可变的值,则不会在您使用它的过程中让其他人意外地更改它

这个的另一个含义是,如果任何人甚至对一个值有一个不可变的引用,我们就不能更改它,否则要么给出一个可变的引用。

无&符号代表拥有的该值(variable)
Rust的另一个聪明之处在于它是如何计算出什么时候应该忘记或从内存中删除数值的。当一个函数完成后,它里面声明的所有值都会被丢弃或自动清理。

嗯,这并不完全正确。如果我们再考虑一下字符串长度函数,我们不希望在长度函数完成后,字符串被完全遗忘。prepend hello函数也一样。在这些情况下,只有对值的引用会被清理掉,但实际的值不会被遗忘。

当我们向HashMap中插入东西的时候呢?在这种情况下,我们希望我们给定的字符串输入能够成为HashMap的一部分。我们希望该值为HashMap所有。

想想看,一个小孩子把他们的一个玩具送给别人。"在这里你可以拥有它。你可以用它做任何事情,而且我不需要它回来。好好享受吧!"(想象中的孩子需要相当成熟,这才是一个可信的场景)。

引用计数的指针(Rc和Arc
我们在Rust中还有两种类型的值是Rc和Arc。

对于Rc来说,可以考虑一下装饰品,比如孩子生日派对上的气球。当每个人都在那里的时候,我们希望每个人都能看到但不碰这些装饰品。而且我们希望这些装饰品一直保持到最后一个孩子离开派对。但是一旦最后一个人离开,我们就可以立即开始清理装饰品。这是一个Rc,即引用计数指针。

Rc跟踪有多少人(或代码的一部分)在看它,并保持这个值,直到最后一个引用被丢弃的时刻。

如果你正在处理异步或多线程代码,你将使用Arc,或原子引用计数指针,但它与Rc的想法是一样的。

大家可以看到这些装饰品,但是派对一结束我们就会把它们清理掉。

总结
我保证,经过一段时间的练习,在写代码时,知道一个函数应该接受一个可变或不可变的引用,或者知道其他库的函数是否可能需要一个引用或拥有的值,会感觉更直观。而不需要用安培尔&符号驱动的开发。