【问题标题】:When should I use a reference instead of transferring ownership?我什么时候应该使用参考而不是转移所有权?
【发布时间】:2018-10-06 06:11:40
【问题描述】:

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

我来自默认情况下值不可变的语言(Haskell、Idris 等)。因此,我可能根本不会考虑使用引用。在两个地方具有相同的值对我来说看起来很危险(或者至少很尴尬)。既然引用是一个特性,那么使用它们肯定是有原因的。

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

【问题讨论】:

  • 同时在两个地方具有相同的值看起来令人困惑 [...] 可变引用尤其看起来非常危险。 您还使用过哪些其他编程语言?其中大量 中的大多数始终隐含地对大多数值使用“可变引用”。您认为大多数语言都是危险的吗?
  • 谈到什么时候拥有资源,什么时候借用资源,往往是软件设计的问题,会引起各种意见。像 Shepmaster 一样,我也不理解您对引用的混淆。也许将问题缩小到一个例子会有所帮助?
  • @Shepmaster 是的,我个人愿意。我来自默认情况下值不可变的语言(Haskell、Idris 等)。因此,我可能根本不会考虑使用引用。但它们是一个特征,所以必须有一个原因。因此,我要问的是:在某些情况下我应该强迫自己使用引用吗?这些情况是什么,为什么它们是有益的?还是他们只是为了方便而默认传递所有权是可以的?
  • @Stargateur 我已经编辑了这个问题,你怎么看?
  • “在两个地方有相同的值对我来说看起来很危险(或者,至少,很尴尬)。”如果你将相同的值传递给两个不同的函数一种纯粹的函数式编程语言,编译器/解释器很可能只是在内部通过引用共享它,这仍然应该是安全的,因为值是不可变的。您能否更好地表达您对 Rust 中存在多个不可变引用的担忧?

标签: reference rust move-semantics borrowing


【解决方案1】:

尤其是可变引用看起来非常危险。

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

general中,您应该传递引用。这可以节省复制内存,并且应该是您默认执行的操作,除非您有充分的理由不这样做。

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

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

【讨论】:

  • 我的理解是传递所有权也不会复制任何内存。我的印象是它应该是默认的。这是错的吗?
  • 您可以推断代码的行为,就好像值在内存中移动一样。在实践中,编译器可能会也可能不会真正移动它。
  • 好的,感谢您的意见。我的印象是,使用引用会使我的值同时存在于太多地方,这使得调试和推理我自己的代码比我总是只在一个地方(即传递所有权)时更痛苦。不过,作为一个更有经验的 rustacean,我会采纳你的建议,并尝试参考。
猜你喜欢
  • 2016-08-09
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2010-09-10
相关资源
最近更新 更多