luk*_*uke 9 reference lifetime rust
我在使用结构的生命周期参数时遇到问题.我不是100%肯定如何描述问题,但我创建了一个显示我的编译时错误的简单案例.
struct Ref;
struct Container<'a> {
r : &'a Ref
}
struct ContainerB<'a> {
c : Container<'a>
}
trait ToC {
fn to_c<'a>(&self, r : &'a Ref) -> Container<'a>;
}
impl<'a> ToC for ContainerB<'a> {
fn to_c(&self, r : &'a Ref) -> Container<'a> {
self.c
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
test.rs:16:3: 18:4 error: method `to_c` has an incompatible type for trait: expected concrete lifetime, but found bound lifetime parameter 'a
test.rs:16 fn to_c(&self, r : &'a Ref) -> Container<'a> {
test.rs:17 self.c
test.rs:18 }
test.rs:16:48: 18:4 note: expected concrete lifetime is the lifetime 'a as defined on the block at 16:47
test.rs:16 fn to_c(&self, r : &'a Ref) -> Container<'a> {
test.rs:17 self.c
test.rs:18 }
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多变化,只是无法编译这个东西.我在这里发现了另一篇文章(如何修复:预期的具体生命周期,但找到了绑定生命周期参数)但似乎解决了问题而不是解决问题.我真的不明白为什么问题甚至起源.&Ref正在通过移动传递,所以它应该正常工作?
有任何想法吗?谢谢你的帮助.
Chr*_*gan 13
让我们比较两个定义.一,特质方法:
fn to_c<'a>(&self, r: &'a Ref) -> Container<'a>;
Run Code Online (Sandbox Code Playgroud)
并实施:
fn to_c(&self, r: &'a Ref) -> Container<'a>;
Run Code Online (Sandbox Code Playgroud)
看到不同?后者没有<'a>.<'a>已在别处指明; 它具有相同名称的事实并不重要:它完全是另一回事.
从功能上讲,你的特征定义表明返回的容器将在其中有一个引用r,但没有任何内容self.它可以self在方法内部使用,但它可能不会在返回的值中存储对它的任何引用.
然而,你的方法定义是使用一个'a将生命周期r和返回的生命周期联系Container起来self(也就是说,对象本身,而不是引用 - ρ2in -it &'?? T<'??>是一个微妙但有时是显着的差异),而特征定义没有这种联系.
通过在实现中插入<'a>方法定义,可以使两者匹配.但请记住,这是影响'a来自ContainerB<'a>; 它不一样'a!我们最好给它另一个名字; 为方便起见,我将进行相反的更改,在impl而不是方法上更改它(要么会这样做):
impl<'b> ToC for ContainerB<'b> {
fn to_c<'a>(&self, r: &'a Ref) -> Container<'a> {
self.c
}
}
Run Code Online (Sandbox Code Playgroud)
但现在,你当然有一个问题:返回值的类型是Container<'b>(因为这是该领域c中ContainerB<'b>是),但你的签名要求Container<'a>(使用一个参考的东西r,而不是从self).
这将修复它是指定的寿命的方法之一&self作为'a在两个特征定义和执行; 在实现中,这将要求'b大于或等于'a(由于您已经成功地将具有生命周期的引用引用到具有生命周期'a的对象'b,并且该对象必须比引用更长)并且因此由于子类型('a是子类型'b)Container<'b>将被安全地强制执行Container<'a>.
当你不熟悉它们时,很难想到这些生活中的问题; 但随着时间的推移,它们变得很自然
| 归档时间: |
|
| 查看次数: |
2778 次 |
| 最近记录: |