我有一段这样的代码:
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>>
,但为什么编译器会出错?
答案 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>>
。
但我在这里所做的只是猜测你真正想要做什么,而你的问题并不清楚。也许你可以提出一个不同的问题,或者将信息添加到这个问题中,或者在评论中解释一下。