**已关闭。**此问题需要debugging details。目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
4天前关闭。
Improve this question的
下面是一个例子:你会期望从迭代器返回的引用必须和迭代器一样长。但是rust似乎希望它反过来。为什么?
pub trait IterValue<I: Iterator<Item = Value>> {
fn iter_value(&self) -> I;
}
impl<'a, 'cellref: 'a> IterValue<std::iter::Map<ndarray::iter::Iter<'cellref, f64, ndarray::Dim<[usize; 2]>>, fn(&'a f64) -> Value>> for ndarray::Array2<f64> {
fn iter_value(&self) -> std::iter::Map<ndarray::iter::Iter<'cellref, f64, ndarray::Dim<[usize; 2]>>, fn(&'a f64) -> Value> {
self.iter().map(|&n| Value::Number(n))
}
}
字符串
错误代码:
the lifetime `'a` as defined here...does not necessarily outlive the lifetime `'cellref` as defined here
型
1条答案
按热度按时间k7fdbhmy1#
过去实现这个目标是相当困难的。幸运的是,Rust
1.75.0
引入了return position impl trait in traits,使这个问题变得更容易解决:字符串
在Rust
1.75.0
之前,它仍然是可行的,但要困难得多。'a
生存期添加到trait.cloned().map(Value::Number)
来避免闭包型
但Rust似乎想让它反过来。
其实不是
如果你发布/阅读
cargo check
的整个输出,你会看到整个does not necessarily outlive
消息只是一个注解:型
真实的错误消息是
error[E0308]: mismatched types
,告诉你编译器期望'a
和'cellref
是相同的,而不是从彼此派生的。如果你指定'a: 'cellref
和'cellref: 'a
,它就可以工作(另外你需要将生存期添加到&self
,这是一个独立的错误):型
但是这样两个生命周期就变得毫无意义了,你可以简单地指定一个生命周期:
型