"预期参考文献,发现结构Rc"克隆并返回Rc时

时间:2018-04-28 06:08:54

标签: rust

我有一段这样的代码:

use std::cell::RefCell;
use std::rc::Rc;

struct A(bool);

impl A {
    fn get_ref(&self) -> &Rc<RefCell<bool>> {
        &Rc::new(RefCell::new(self.0))
    }

    fn copy_ref(&self) -> &Rc<RefCell<bool>> {
        Rc::clone(self.get_ref())
    }
}

fn main() {
    let a = A(true);
    a.copy_ref();
}

我收到警告抱怨Rc::clone函数没有获得参考:

error[E0308]: mismatched types
  --> src/main.rs:12:9
   |
12 |         Rc::clone(self.get_ref())
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found struct `std::rc::Rc`
   |
   = note: expected type `&std::rc::Rc<std::cell::RefCell<bool>>`
              found type `std::rc::Rc<std::cell::RefCell<bool>>`

我整晚都在努力,但我无法让它发挥作用。方法get_ref已经输入为&Rc<RefCell<bool>>,但为什么编译器会出错?

1 个答案:

答案 0 :(得分:3)

该错误并未讨论您在Arc::clone()中添加的参数,而是整个表达式Rc::clone(...) ,其类型(Rc<...>)不同于返回函数的类型(&Rc<...>)。

如果您向Rc::clone传递了错误的参数,那么它应该看起来像这样:

  --> src/main.rs:13:19
   |
13 |         Rc::clone(false)
   |                   ^^^^^ expected reference, found bool
   |
   = note: expected type `&std::rc::Rc<_>`
              found type `bool`

因此修复类型错误的天真方法是编写&Rc::clone(...)。然后函数的最后一个表达式与函数声明的返回类型具有相同的类型。但正如您将注意到的,之后您将会收到其他错误。

让我们退一步看看你的方法在这里是有缺陷的。最重要的一点,请参阅"Is there any way to return a reference to a variable created in a function?"。剧透:你真的不想。所以像get_ref()这样的结构只是没有意义,因为你返回对你在函数内创建的变量的引用(类型为Rc的变量)。

在您的情况下,直接解决方案可能非常简单:只需删除引用即可。 Rc<T>已经是指针/引用类型,因此不需要(通常)对它进行引用。

但是,由于您使用的是Rc,因此您可能对引用计数感兴趣。因此,在这种情况下,每次调用函数时,您可能不应创建新的Rc。否则你最终会得到一堆引用计数为1的Rc,这不是重点。因此,您的类型A应该已存储Rc<RefCell<bool>>

但我在这里所做的只是猜测你真正想要做什么,而你的问题并不清楚。也许你可以提出一个不同的问题,或者将信息添加到这个问题中,或者在评论中解释一下。