我昨晚发布了一个类似的问题(Rust lifetime error expected concrete lifetime but found bound lifetime),但现在仍然无法弄清楚如何将其应用于此案例。再次,一个简化的例子如下:
struct Ref;
struct Container<'a> {
r : &'a Ref
}
struct ContainerB<'a> {
c : Container<'a>
}
trait ToC {
fn from_c<'a>(r : &'a Ref, c : Container<'a>) -> Self;
}
impl<'b> ToC for ContainerB<'b> {
fn from_c<'a>(r : &'a Ref, c : Container<'a>) -> ContainerB<'a> {
ContainerB{c:c}
}
}
显示错误消息:
test.rs:16:3: 18:4 error: method `from_c` has an incompatible type for trait: expected concrete lifetime, but found bound lifetime parameter 'a
test.rs:16 fn from_c<'a>(r : &'a Ref, c : Container<'a>) -> ContainerB<'a> {
test.rs:17 ContainerB{c:c}
test.rs:18 }
test.rs:16:67: 18:4 note: expected concrete lifetime is the lifetime 'b as defined on the block at 16:66
test.rs:16 fn from_c<'a>(r : &'a Ref, c : Container<'a>) -> ContainerB<'a> {
test.rs:17 ContainerB{c:c}
test.rs:18 }
error: aborting due to previous error
我认为需要发生的是我需要一些方法来等同/子类型生命周期'a
和生命周期'b
。与前面的示例不同,没有&self
可供使用。我猜我可以通过在我的特性(trait ToC<'a> ...
)中添加一个生命周期类型参数来做到这一点,但我不想这样做,因为它在我想要使用特征作为一个地方添加额外的<'a>
类型绑定。
如果有人好奇(AKA可以忽略这个),实际上可能会出现这种情况,我在库中使用它来转换rust和python类型。特征是here。一切正常,但我正在尝试围绕PyObject
类型实现一个包装器(例如numpy ndarray),并且能够使用它将它转换为PyObject和从PyObject转换。
再次感谢!
答案 0 :(得分:1)
这可归结为与前一个问题相同的问题。
Self
指的是您正在为其实现特征的类型。在这种情况下它是ContainerB<'b>
,因此关于它不相同的整个事情适用;这一次,没有什么可以将'b
和'a
联系在一起;生命周期是并且必须由编译器假定为可能不相交。 (这与保证&'a ContainerB<'b>
的{{1}}截然不同。)
一旦使用了在方法上定义的生命周期,就无法在'b ≥ 'a
上使用生命周期。最好的解决方案是将生命周期参数从方法转移到特征:
Self