【问题标题】:Can I use a mutable reference method like a value-passing one?我可以使用可变引用方法,比如传值方法吗?
【发布时间】:2017-05-01 13:01:03
【问题描述】:

我可以使用可变引用方法,比如传值方法吗?例如,我可以使用

o.mth(&mut self, ...)

作为

o.mth(self, ...)

这将允许我返回结果而不用担心o 的生命周期。它可能涉及move 闭包或某种包装器?

对于上下文,我正在尝试使用 rust-csv 包在 CSV 记录上返回一个装箱的迭代器,但迭代器的寿命不能超过阅读器,Reader::records(&'t mut self) 可变地借用。将此与 BufRead::lines(self) 进行对比,后者会消耗其阅读器,因此可以在没有生命周期问题的情况下返回。

【问题讨论】:

  • 相关:stackoverflow.com/q/36645452/155423stackoverflow.com/q/30488928/155423stackoverflow.com/q/38797960/155423——无论出于何种原因,每个人都想返回一个 CSV 迭代器。
  • 由于迭代器元素没有被借用,看起来记录迭代器可以被重新制作为按值获取R: Read。由于&mut R 实现了Read where R: Read,它涵盖了这两种情况。
  • @bluss 是的,我对此感到惊讶。我认为它们将是字符串切片。不过,这样的变化仍然是一个破坏性的 API 变化,但适应起来并不可怕。

标签: rust lifetime borrow-checker


【解决方案1】:

不,你不能。 self&self&mut self 方法之所以存在,是因为它们的行为不同,有不同的限制,允许不同的事情。

在这种情况下,您最终可能会尝试to create an iterator that yields references to itself,这是不允许的,或者store a value and a reference to that value in the same struct,也是不允许的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2014-03-04
    • 2012-08-22
    • 2020-07-05
    • 2014-05-19
    相关资源
    最近更新 更多