相关疑难解决方法(0)

如何将 Rc<RefCell<Box<MyStruct>>> 传递给接受 Rc<RefCell<Box<dyn MyTrait>>> 的函数?

我最初在这里问过这个问题,但它被标记为重复,尽管在我看来它只重复了其中的一部分,所以我创建了一个更具体的问题:

考虑以下代码:

use std::rc::Rc;

trait MyTrait {
    fn trait_func(&self);
}

struct MyStruct1;

impl MyStruct1 {
    fn my_fn(&self) {
        // do something
    }
}

impl MyTrait for MyStruct1 {
    fn trait_func(&self) {
        // do something
    }
}

fn my_trait_fn(t: Rc<dyn MyTrait>) {
    t.trait_func();
}

fn main() {
    let my_str: Rc<MyStruct1> = Rc::new(MyStruct1);
    my_trait_fn(my_str.clone());
    my_str.my_fn();
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常。现在我想更改 的定义trait_func以接受 a &mut self,但它不会像Rc仅适用于不可变数据那样工作。我使用的解决方案是包装MyTraitRefCell

use std::cell::RefCell;

fn my_trait_fn(t: Rc<RefCell<Box<dyn MyTrait>>>) {
    t.borrow_mut().trait_func();
}

fn …
Run Code Online (Sandbox Code Playgroud)

smart-pointers rust trait-objects

8
推荐指数
1
解决办法
2332
查看次数

盒装特征创造背后的机制如何运作?

我无法理解盒装特征的价值是如何形成的.请考虑以下代码:

trait Fooer {
    fn foo(&self);
}

impl Fooer for i32 {
    fn foo(&self) { println!("Fooer on i32!"); }
}

fn main() {
    let a = Box::new(32);                    // works, creates a Box<i32>
    let b = Box::<i32>::new(32);             // works, creates a Box<i32>
    let c = Box::<Fooer>::new(32);           // doesn't work
    let d: Box<Fooer> = Box::new(32);        // works, creates a Box<Fooer>
    let e: Box<Fooer> = Box::<i32>::new(32); // works, creates a Box<Fooer>
}
Run Code Online (Sandbox Code Playgroud)

显然,变体a和b是微不足道的.但是,变量c没有,可能是因为该new函数只采用相同类型的值,而不是这种情况Fooer != i32.变种d和e的工作,这让我怀疑某种自动转换从Box<i32>Box<Fooer>正在执行. …

polymorphism boxing traits representation rust

5
推荐指数
2
解决办法
143
查看次数

如何将 Vec&lt;Box&lt;dyn Trait&gt;&gt; 移动到 Vec&lt;Rc&lt;RefCell&lt;dyn Trait&gt;&gt;&gt;

我有一个Vec<Box<dyn Trait>>作为输入,我想将它的元素存储在一个Vec<Rc<RefCell<dyn Trait>>>. 最好的方法是什么?

我试过:

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

trait Trait {}

fn main() {
    let mut source: Vec<Box<dyn Trait>> = Vec::new();
    let mut dest: Vec<Rc<RefCell<dyn Trait>>> = Vec::new();

    for s in source {
        let d = Rc::new(RefCell::new(s.as_ref()));
        dest.push(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了错误:

error[E0277]: the trait bound `&dyn Trait: Trait` is not satisfied
  --> src/main.rs:12:19
   |
12 |         dest.push(d);
   |                   ^ the trait `Trait` is not implemented for `&dyn Trait`
   |
   = note: required for the cast …
Run Code Online (Sandbox Code Playgroud)

casting traits rust

5
推荐指数
1
解决办法
393
查看次数

为什么我不能用 let _ 创建 trait 对象:Arc&lt;dyn Trait&gt; = value.into()?

use std::sync::Arc;

trait Trait {}
struct TraitImpl {}
impl Trait for TraitImpl {}

fn main() {
    let value = TraitImpl {};
    let _: Arc<dyn Trait> = Arc::new(value);    // compiles
    let _: Arc<dyn Trait> = value.into();       // doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

结果

use std::sync::Arc;

trait Trait {}
struct TraitImpl {}
impl Trait for TraitImpl {}

fn main() {
    let value = TraitImpl {};
    let _: Arc<dyn Trait> = Arc::new(value);    // compiles
    let _: Arc<dyn Trait> = value.into();       // doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

( …

generics traits rust trait-objects

3
推荐指数
1
解决办法
749
查看次数