小编Vai*_*nne的帖子

如何将 Rc<RefCell<ConcreteType>> 转换为 Rc<RefCell<dyn Trait>>?

我正在尝试转换Rc<RefCell<Data>>Rc<RefCell<dyn Interface>>Data实现Interface),但在通用方法中这是不可能的:

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

trait Interface {
    fn pouet(&self);
}

struct Data {}

impl Interface for Data {
    fn pouet(&self) {
        println!("pouet");
    }
}

fn helper<T>(o: &Rc<RefCell<T>>)
where
    T: Interface,
{
    let t = o as &Rc<RefCell<dyn Interface>>;
    work(t);
}

fn work(o: &Rc<RefCell<dyn Interface>>) {
    o.borrow().pouet();
}

fn main() {
    // work
    {
        let o = Rc::new(RefCell::new(Data {}));
        work(&(o as Rc<RefCell<dyn Interface>>));
    }
    // raise an compile error
    {
        let …
Run Code Online (Sandbox Code Playgroud)

generics rust trait-objects

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

str 类型的生命周期/借用问题

为什么这段代码会编译?

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

fn main() {
    let x = "eee";
    let &m;
    {
        let y = "tttt";
        m = longest(&x, &y);
    }
    println!("ahahah: {}", m);
}
Run Code Online (Sandbox Code Playgroud)

对我来说,由于生命周期,应该存在编译错误。如果我用 编写相同的代码i64,则会出现错误。

fn ooo<'a>(x: &'a i64, y: &'a i64) -> &'a i64 {
    if x > y {
        x
    } else {
        y
    }
}

fn main() {
    let x = …
Run Code Online (Sandbox Code Playgroud)

lifetime rust borrowing

4
推荐指数
1
解决办法
70
查看次数

标签 统计

rust ×2

borrowing ×1

generics ×1

lifetime ×1

trait-objects ×1