我显然(通过这个问题)对拉斯特是个新手.在下面的示例中,编译器要求g(...)中的两个borrow 超过'static.我不明白为什么会这样,我怎么才能缩小范围.我实际上不知道这些薄片的生命周期 (尽管我知道内部和外部一样长).我遗漏了什么?我读过《铁 rust 》一书中关于生命的解释,也读过几篇关于生命的帖子,但虽然经常被问到生命的问题,但没有一个讨论真正回答了这一点(或者我看不到匹配).

这里是简化形式的有问题的代码:

pub trait A <X> 
where X: Copy
{
    fn f(&mut self, x: Box<dyn Iterator<Item=&[X]>>) -> Option<X>;

    fn g(&mut self, x: &[&[X]]) -> Option<X> {
        self.f(Box::new(x.iter().copied().cycle()))
    }
}

Rustc 1.66.0

推荐答案

之所以会发生这种情况,是因为dyn Trait实际上有一个可以省略的生命周期,那就是'static.所以当你写dyn Trait的时候,编译器会看到dyn Trait + 'static.由于您试图将x.iter().copied().cycle()传递给函数,这意味着得到的Iter必须有'static个生存期.如果您明确了生命周期,您会发现它编译得很好:

pub trait A <X> 
where X: Copy
{
    fn f<'a, 'b>(&mut self, x: Box<dyn Iterator<Item=&'b[X]> + 'a>) -> Option<X>;

    fn g<'a, 'b>(&mut self, x: &'a [&'b [X]]) -> Option<X> {
        self.f(Box::new(x.iter().copied().cycle()))
    }
}

Rust相关问答推荐

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

在自身功能上实现类似移动的行为,以允许通过大小的所有者进行呼叫(&;mut;self)?

通过不同的字段进行散列和排序的 struct (需要不同的EQ实现)

将PathBuf转换为字符串

在本例中,为什么我不能一次多次borrow 可变变量?

用于判断整数块是否连续的SIMD算法.

带引脚和不带引脚的比较功能

如何迭代存储在 struct 中的字符串向量而不移动它们?

Rust 如何将链表推到前面?

pyO3 和 Panics

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

为什么可以在迭代器引用上调用 into_iter?

以 `static` 为前缀的闭包是什么意思?我什么时候使用它?

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

Rust 中 `Option` 的内存开销不是常量

如何解析 Rust 中的 yaml 条件字段?

在 Rust 中为泛型 struct 编写一次特征绑定

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

返回 &str 但不是 String 时,borrow 时间比预期长

返回引用的返回函数