在Self和方法上排除不同的生命周期

时间:2014-07-20 17:34:12

标签: rust traits lifetime

我昨晚发布了一个类似的问题(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转换。

再次感谢!

1 个答案:

答案 0 :(得分:1)

这可归结为与前一个问题相同的问题。

Self指的是您正在为其实现特征的类型。在这种情况下它是ContainerB<'b>,因此关于它不相同的整个事情适用;这一次,没有什么可以将'b'a联系在一起;生命周期是并且必须由编译器假定为可能不相交。 (这与保证&'a ContainerB<'b>的{​​{1}}截然不同。)

一旦使用了在方法上定义的生命周期,就无法在'b ≥ 'a上使用生命周期。最好的解决方案是将生命周期参数从方法转移到特征:

Self