我应该何时使用参考而不是转让所有权?

Mai*_*tor 3 reference move-semantics rust borrowing

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

我来自默认值不可变的语言(Haskell,Idris等).因此,我可能永远不会考虑使用引用.在两个地方拥有相同的价值对我来说是危险的(或者至少是尴尬的).由于引用是一个功能,因此必须有理由使用它们.

有没有情况我应该强迫自己使用参考?这些情况是什么?为什么它们有益?或者他们只是为了方便和默认通过所有权是好的?

Pet*_*all 11

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

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

一般你应该通过引用左右.这节省了复制内存,应该是你做的默认操作,除非你有充分的理由不这样做.

转移所有权的一些好理由:

  1. 当值的类型是体积小,比如bool,u32等它通常更好的性能,移动/复制这些值,以避免间接的级别.通常这些值会实现Copy,实际上编译器可能会自动为您进行优化.由于强大的类型系统和默认的不变性,它可以自由地做!
  2. 当值的当前所有者将超出范围时,您可能希望将值移动到其他位置以使其保持活动状态.

  • 我的理解是,传递所有权也不会复制任何内存。我的印象是它应该是默认的。这是错误的吗? (2认同)
  • 好的,感谢您的输入。我的印象是,使用引用会使我的值同时存在于太多地方,使得调试和推理我自己的代码比我只在一个地方使用它们更痛苦,总是(即传递所有权)。不过,我会以更有经验的 rustacean 的身份接受您的建议,并尝试参考。 (2认同)