Reference 我什么时候应该使用引用而不是转移所有权?

Reference 我什么时候应该使用引用而不是转移所有权?,reference,rust,move-semantics,borrowing,Reference,Rust,Move Semantics,Borrowing,从中,可以通过转移所有权或使用可变或不可变引用将不可复制的值传递给函数。当您转移某个值的所有权时,它不能再用于原始函数中:如果您想要,必须将其返回。传递引用时,可以借用该值,并且仍然可以使用它 我来自默认值不可变的语言(Haskell、Idris等)。因此,我可能根本不会考虑使用引用。在我看来,在两个地方拥有相同的价值观是危险的(或者至少是尴尬的)。因为引用是一种特性,所以必须有理由使用它们 是否存在我应该强迫自己使用参考资料的情况?这些情况是什么?为什么它们是有益的?或者他们只是为了方便,默认

从中,可以通过转移所有权或使用可变或不可变引用将不可复制的值传递给函数。当您转移某个值的所有权时,它不能再用于原始函数中:如果您想要,必须将其返回。传递引用时,可以借用该值,并且仍然可以使用它

我来自默认值不可变的语言(Haskell、Idris等)。因此,我可能根本不会考虑使用引用。在我看来,在两个地方拥有相同的价值观是危险的(或者至少是尴尬的)。因为引用是一种特性,所以必须有理由使用它们

是否存在我应该强迫自己使用参考资料的情况?这些情况是什么?为什么它们是有益的?或者他们只是为了方便,默认所有权转移是可以的

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

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

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

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

  • 当值的类型较小时,例如
    bool
    u32
    等。移动/复制这些值通常会提高性能,以避免间接寻址。通常这些值实现
    Copy
    ,实际上编译器可能会自动为您进行此优化。由于强大的类型系统和默认的不变性,它可以自由地做一些事情
  • 当值的当前所有者将超出范围时,您可能希望将该值移动到其他位置以使其保持活动状态

  • 同时在两个位置具有相同的值看起来很混乱[…]尤其是可变引用看起来非常危险。您还使用过哪些其他编程语言?它们中的绝大多数总是隐式地对大多数值使用“可变引用”。你认为大多数语言都是危险的吗?谈到何时拥有资源和何时借用它们通常是软件设计的问题,并能引起各种意见。和谢普马斯特一样,我也不理解你对推荐信的混淆。也许将问题缩小到一个例子会有所帮助?@Shepmaster是的,我个人会的。我来自默认值不可变的语言(Haskell、Idris等)。因此,我可能根本不会考虑使用引用。但它们是一种特性,所以一定有原因。因此,我要问的是:是否存在我应该强迫自己使用参考资料的情况?这些情况是什么?为什么它们是有益的?或者它们只是为了方便,默认传递所有权是可以的?@Stargateur我编辑了这个问题,你认为呢?“在两个地方具有相同的值对我来说是危险的(或者至少是尴尬的)。”如果你用纯函数式编程语言将相同的值传递给两个不同的函数,编译器/解释器很可能只是在内部通过引用共享它,这应该仍然是安全的,因为该值是不可变的。你能更好地表达你对Rust中有多个不可变引用的担忧吗?我的理解是,传递所有权也不会复制任何内存。我觉得这应该是默认的。这是错误的吗?您可以对代码的行为进行推理,就像值在内存中移动一样。实际上,编译器可能会移动它,也可能不会移动它。好的,谢谢你的输入。我的印象是,使用引用将使我的值同时存在于太多的地方,这使得调试和推理我自己的代码比我只在一个地方使用它们时更痛苦,总是这样(即,传递所有权)。不过,我会把你的建议当作一个更有经验的rustacean人来接受,并尝试推荐人。