Generics 处理“转为”泛型时的锈蚀寿命问题
谢谢你纠正我提问的方式。为了使代码可编译,我做了几次修改Generics 处理“转为”泛型时的锈蚀寿命问题,generics,rust,lifetime,Generics,Rust,Lifetime,谢谢你纠正我提问的方式。为了使代码可编译,我做了几次修改 使用std::marker::PhantomData; 结构支撑{ x:i32, } 内支架{ fn变换(&self,n:i32)->魔鬼{ 魔鬼{ hp:self.x+n, 武器:没有, } } } 结构栏,//用于解析“未使用的生存期参数A”的标记 } impl>>Foo>,, } 恳求{ fn臂{ self.wearm=Some(biu.into()); 自己 } fn杀戮世界(自我){ 未执行!() } } transform_
使用std::marker::PhantomData;
结构支撑{
x:i32,
}
内支架{
fn变换(&self,n:i32)->魔鬼{
魔鬼{
hp:self.x+n,
武器:没有,
}
}
}
结构栏,//用于解析“未使用的生存期参数A”的标记
}
impl>>Foo>,,
}
恳求{
fn臂{
self.wearm=Some(biu.into());
自己
}
fn杀戮世界(自我){
未执行!()
}
}
transform_and_arm()
方法旨在通过去掉brace
和buz
来使用Foo
的实例。它调用brace.transform()。它用buz.unwrap()
来增强恶魔的力量
问题是,调用let-wearm=buz.into()
是合法的,同时调用devil=devil.arm(buz)代码>导致终身问题
看来这个问题与生命有很大关系。如果没有“魔鬼a”,那么所有这些问题都会消失。编辑:我以前的回答没有很好地解释这个问题。这是另一种尝试
出现此问题的原因是变换
有缺陷。为了找出原因,让我们看看编译器为转换
推断了哪些生存期:
fn transform<'a>(&'a self, n: i32) -> Devil<'a>
我们可以看到,魔鬼
的寿命参数与其武器
相关
回顾变换
,然而
fn transform<'a>(&'a self, n: i32) -> Devil<'a> {
Devil {
hp: self.x + n,
weapon: None,
}
}
非常感谢。它在对测试代码进行相同的修改后编译,我开始理解问题存在的原因。然而,实际情况是,transform()
是作为第三方库提供的函数(实际上是hyper::client::client::get()。我仍然想知道为什么变换和手臂(自我)
不能工作。由于恶魔的寿命一直持续到C行,所以无论如何它都不会比brace或Foo更长寿,因为Foo在C行之后被消耗掉。另一个相关的观察结果是,取消注释devil.slay_the_world()代码>仅不会导致编译错误,但会取消注释devil.arm(buz)代码>然后将。我只是想使用transform\u和\u arm(self)
中Foo的所有字段。
struct Devil<'a> {
hp: i32,
weapon: Option<Bar<'a>>,
}
fn transform<'a>(&'a self, n: i32) -> Devil<'a> {
Devil {
hp: self.x + n,
weapon: None,
}
}
fn transform<'a, 'b>(&'a self, n: i32) -> Devil<'b>