【问题标题】:Why can't RefCell be used as a self parameter为什么RefCell不能作为self参数
【发布时间】:2022-08-20 09:04:43
【问题描述】:

你可以这样做:

impl Foo {
  fn foo(self: &Rc<Self>) {}
}

但不是这个:

impl Foo {
  fn foo(self: &Rc<RefCell<Self>>) {}
}

前者非常有用 - 例如我可以让方法返回包含对self 的弱引用的对象。但是因为我不能使用RefCell,所以我不能返回任何会改变self 的东西。

有一些方法可以解决这个问题(例如,在内部将整个结构包装在 RefCell 中),但对于我当前的任务来说,没有一个比允许 self: &amp;Rc&lt;RefCell&lt;&gt;&gt; 更方便。

允许的语法描述为here。它允许BoxRcArcPin,但不允许RefCell。为什么?

  • 您是在问“为什么没有完成”,在这种情况下,这应该以基于意见的方式关闭,还是“rustc 如何知道它是不允许的”或类似的问题,在这种情况下,您应该澄清?
  • 这是一个unstable feature,每晚工作。不过,目前似乎没有太多工作要做。
  • @isaactfa It still does not allow RefCell。据我记得,它只跟踪原始指针作为自我类型并定义你自己的类型。
  • 我认为没有可以引用的官方答案。我能想到的最好的是RefCell 不是指针类型,因此它不适合self。因此我想关闭它(我不能单独关闭一个问题,只有在其他人同意的情况下)。
  • Pin 被认为是一个智能指针(它甚至暗示了Deref[Mut])。

标签: rust


【解决方案1】:

截至撰写本文时,即 2022 年 8 月,方法接收器类型支持仍然相当有限,仅限于少数类型和这些类型的组合。您已经注意到RefCell 不在其中。

arbitrary_self_types 是扩展self 可能类型的功能,有一个tracking issue 用于讨论其实现。从讨论来看,这个特性目前似乎是针对实现Deref[Mut] 的类型,而RefCell 没有实现。 A few comments 指出这是有限制的,所以仍有可能。

归根结底,我认为答案是RefCell 不起作用,因为尚未对成熟的功能进行足够彻底的设计。 Rust 团队可能实现了基本功能,以便我们可以将 Pin 作为 self 类型,从而使期货工作,并添加了一些其他“简单”的类型来获得更多收益,但是一个适当和通用的实施已被推迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2021-12-25
    • 2019-05-24
    • 2013-11-19
    • 2021-03-12
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    相关资源
    最近更新 更多