gpt4 book ai didi

rust - 克隆并返回 Rc 时为 "Expected reference, found struct Rc"

转载 作者:行者123 更新时间:2023-11-29 08:25:04 28 4
gpt4 key购买 nike

我有一段代码是这样的:

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>> , 但为什么编译器会报错呢?

最佳答案

错误不是在谈论你放入 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每次调用函数时。否则你可能会得到一堆 Rc s 的引用计数为 1,这不是重点。所以相反,你的类型 A应该已经存储了 Rc<RefCell<bool>> .

但我在这里所做的只是猜测您实际想做什么,而您的问题并不清楚。也许您可以问一个不同的问题,或者将信息添加到这个问题中,或者在评论中对此进行解释。

关于rust - 克隆并返回 Rc 时为 "Expected reference, found struct Rc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50073458/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com