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>