15

Rust 书中关于所有权的章节中,不可复制的值可以通过转移所有权或使用可变或不可变引用传递给函数。当您转移一个值的所有权时,它不能再在原始函数中使用:如果您愿意,您必须将其返回。当你传递一个引用时,你借用了这个值并且仍然可以使用它。

我来自默认情况下值不可变的语言(Haskell、Idris 等)。因此,我可能根本不会考虑使用引用。在两个地方具有相同的值对我来说看起来很危险(或者至少很尴尬)。由于引用是一项功能,因此必须有理由使用它们。

在某些情况下我应该强迫自己使用引用吗?这些情况是什么,为什么它们是有益的?还是他们只是为了方便而默认传递所有权是可以的?

4

1 回答 1

15

特别是可变引用看起来非常危险。

它们并不危险,因为 Rust 编译器不会让你做任何危险的事情。如果你有一个&mut值的引用,那么你不能同时有任何其他的引用。

一般来说您应该传递参考。这可以节省复制内存,并且应该是您执行的默认操作,除非您有充分的理由不这样做。

转移所有权的一些充分理由:

  1. 当值的类型较小时,例如bool,u32等。移动/复制这些值以避免一定程度的间接性通常会获得更好的性能。通常这些值实现Copy,实际上编译器可能会自动为您进行优化。由于强大的类型系统和默认的不变性,它可以免费做一些事情!
  2. 当值的当前所有者将超出范围时,您可能希望将值移动到其他位置以使其保持活动状态。
于 2018-04-25T17:20:17.027 回答