这是代码(具有 Rust 初学者难度):

use std::cell::RefCell;
use std::collections::HashMap;

pub trait TIndex<'a> {
    // cut
}

pub struct HashMapIndex<'a> {
    pub filter_by_keyword: HashMap<String, &'a str> // simplified (and ugly)
}

impl<'a> TIndex<'a> for HashMapIndex<'a> {
    // cut
}

pub struct Matcher<'a> {
    pub index: &'a RefCell<Box<dyn TIndex<'a> + 'a>>
}

impl<'a> Matcher<'a> {
    pub fn new(index: &'a RefCell<Box<dyn TIndex<'a> + 'a>>) -> Self {
        Matcher {
            index
        }
    }
}

pub fn main() {
    let index = HashMapIndex {
        filter_by_keyword: HashMap::new()
    };
    let boxed_index: Box<dyn TIndex> = Box::new(index);
    let refcell = RefCell::from(boxed_index);
    let mut _matcher = Matcher::new(
        &refcell // `refcell` does not live long enough
    );
}

操场

我不确定我是否明白出了什么问题(但肯定有问题)。 'a在这里是一个main()函数作用域, indexrefcell一直存在,直到 main() 退出。 matcher接受的参考RefCell是生活至少'a和引用一个框,生活至少'a和点到TIndex特质对象的生活至少'a ,其内部居住至少'a

它应该如何改变(这里的生命周期声明有什么问题)?

附注。 我得到一个编译器提示(在main()关闭} ):

    }
    | -
    | |
    | `refcell` dropped here while still borrowed
    | borrow might be used here, when `refcell` is dropped and runs the destructor for type `RefCell<Box<dyn TIndex<'_>>>`

不确定我是否理解它,因为refcell是通过引用传递的(由_matcher借用)。

#1楼 票数:2 已采纳

不确定我是否理解它,因为 refcell 是通过引用传递的(由 _matcher 借用)。

问题是你定义了Matcher使得RefCell的生命周期和RefCell内容的生命周期必须相同。

这意味着你告诉 rustc RefCell必须与它所包含的内容一样长,这意味着一旦你将RefCell放入Matcher ......你的程序就不RefCell工作了,因为容器不能正确地超过它的内容。

您需要拆分您的生命周期,以便 rustc 知道它们如何嵌套,至少您需要为&RefCell及其内容赋予不同的生命周期——并告诉 rustc 内容比&RefCell

pub struct Matcher<'a, 'b> {
    pub index: &'a RefCell<Box<dyn TIndex<'b> + 'b>>
}

impl<'a, 'b: 'a> Matcher<'a, 'b> {
    pub fn new(index: &'a RefCell<Box<dyn TIndex<'b> + 'b>>) -> Self {
        Matcher {
            index
        }
    }
}

拆分TIndex的生命周期参数和TIndex的生命周期界限( TIndex的内容应该比它更长寿)也可能是一个好主意,但对于您在此处发布的重现似乎没有必要。

  ask by 4ntoine translate from so

未解决问题?本站智能推荐:

1回复

泛型中奇怪的“借来的价值活得不够久”

这段简单的代码让我发疯: pub fn load_any<'a, T, K>(&self, key: K) -> Result<Option<T>, kv::Error> where T: 'a + Persistent + Debug +
1回复

嵌套结构:“借来的价值活得不够久”

我一直致力于创建一个Table结构,它可以解析为Val trait 对象以及其他数据类型(以Number为例),可以在 Rust Playground here 中看到。 我一直无法解决这个借用/生命周期问题,但我的想法是Number和Table都是Val对象。 但是,任何将对象写入String缓冲
2回复

“借来的价值活得不够长”,在循环中使用时丢弃

赏金将在 4 天后到期。 这个问题的答案有资格获得+50声望奖励。 Timothy Alexis Vass想要奖励
1回复

推入向量时“借来的价值活得不够久”

我正在尝试一个日常程序员问题来洗牌参数列表并输出它们。 我不确定这是否是正确的方法,但听起来是个好主意:从 args 向量中删除元素,使其不会重复,然后将其插入到结果向量中。 extern crate rand; // 0.7.3 use std::io; use std::cmp::Order
1回复

在显式生命周期中,值的存活时间不够长,但在省略时则活得足够长

我有以下Rust程序,它将一个闭包传递给一个生命周期中的函数泛型'a和一个类型为F的闭包,它通过引用一些本地数据来调用闭包: 这无法编译,并显示以下消息: 我的最小例子现在可能有点太小了,因为对于这个例子,有效的解决方案是删除'a,和'a 。 但是,我在一个更复杂的程序中也有类
1回复

从rust-xcb调用`roots`时,“活不够长”错误

我正在尝试在xcb创建的窗口中使用Cairo表面。 我有一个C例子以及Rust XCB和Cairo绑定。 我差不多完成了,但这个错误对我来说仍然是一个谜。 我的代码: 我称之为: 并获得如下错误: screen和depth变量的错误相同。 有人可以解释 -
1回复

Rust 说函数参数不够活跃,即使已经设置了适当的生命周期

对于背景上下文:我正在创建一个基于观察者/订阅者的全局事件系统(使用单个共享事件系统)。 我决定使用FnMut作为我的回调闭包。 放置在临时结构Data<'a>的impl中的生命周期'a应该允许方法mut_func()的callback参数与整个Data结构一样长。 因为callback
1回复

Rust的生存期-变量的生存时间不够长,错误[重复]

这个问题已经在这里有了答案: 有什么方法可以返回对在函数中创建的变量的引用? 3个答案 我遇到了锈蚀寿命问题,无法解决。 我对以下内容进行了很多调整,但我不断引入新的错误。 我希望索引返回一个Vector对象。 我有: 我正在努力做 但是