rust - 无法在装箱特征对象上调用方法,因为它的生命周期不够长

标签 rust lifetime

<分区>

我想编写一个函数来解析字符串并返回实现特征对象的几个结构之一,该特征对象允许分发对实现结构的引用。用例是从确定使用哪个实现的配置文件中读取字符串。代码如下所示:

trait Foo<'a> {
    fn get(&'a self) -> &'a i32;
}

struct Bar {
    data: i32,
}

impl<'a> Foo<'a> for Bar {
    fn get(&'a self) -> &'a i32 {
        &self.data
    }
}

struct Baz {
    data: i32,
}

impl<'a> Foo<'a> for Baz {
    fn get(&'a self) -> &'a i32 {
        &self.data
    }
}

fn get_foo(foo: &str) -> Box<dyn Foo> {
    let split = foo.splitn(2, "+").collect::<Vec<_>>();
    let data = i32::from_str_radix(split[1], 10).unwrap();

    if foo.starts_with("bar") {
        Box::new(Bar { data })
    } else {
        Box::new(Baz { data })
    }
}

fn main() {
    let foo = get_foo("bar+0");
    println!("Foo: {}", foo.get());
}

但是,当我这样做时,出现了这个错误:

error[E0597]: `*foo` does not live long enough
  --> src/main.rs:38:25
   |
38 |     println!("Foo: {}", foo.get());
   |                         ^^^ borrowed value does not live long enough
39 | }
   | - `*foo` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

这在 Rust 中可以做到吗?

最佳答案

感谢@Shepmaster 指出特征对象的生命周期不是可行的方法。将生命周期移至各个方法(在此示例中又可以省略)效果很好:

trait Foo {
    fn get(&self) -> &i32;
}

struct Bar {
    data: i32,
}

impl Foo for Bar {
    fn get(&self) -> &i32 {
        &self.data
    }
}

struct Baz {
    data: i32,
}

impl Foo for Baz {
    fn get(&self) -> &i32 {
        &self.data
    }
}

fn get_foo(foo: &str) -> Box<dyn Foo> {
    let split = foo.splitn(2, "+").collect::<Vec<_>>();
    let data = i32::from_str_radix(split[1], 10).unwrap();

    if foo.starts_with("bar") {
        Box::new(Bar { data })
    } else {
        Box::new(Baz { data })
    }
}

fn main() {
    let foo = get_foo("bar+0");
    println!("Foo: {}", foo.get());
}

关于rust - 无法在装箱特征对象上调用方法,因为它的生命周期不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52838884/

相关文章:

c++ - 函数中局部变量的生命周期是否一定等于该函数执行的生命周期?

Rust:为什么在 struct 中借用引用会借用整个 struct?

rust - Rust:如何将BytesMut转换/读取为文件?

c# - 在 DllImport 中使用 Unicode 字符串和用 Rust 编写的 DLL

generics - 生命周期结束时,通用类型参数不受限制

rust - 如何将创建包含具有生命周期的 Cell 的结构的函数传递给另一个函数?

c++ - 为什么临时延长生命周期会导致多次调用析构函数?

rust - 匿名切片生命周期

file - 用于迭代 FASTA 文件并返回结构的代码设计应该是什么?

stream - 如何在 Rust 中从 futures::stream::wait::Wait 中提取项目?