Rust 锈蚀寿命误差

Rust 锈蚀寿命误差,rust,lifetime,Rust,Lifetime,有人能说出以下代码中的生存期错误是什么吗?(根据我的实际代码简化)我自己已经检查过了,但我不知道哪里出了问题或如何修复它。当我尝试添加单元格时出现问题,但我不确定原因 use std::cell::Cell; struct Bar<'a> { bar: &'a str, } impl<'a> Bar<'a> { fn new(foo: &'a Foo<'a>) -> Bar<'a> { Bar{b

有人能说出以下代码中的生存期错误是什么吗?(根据我的实际代码简化)我自己已经检查过了,但我不知道哪里出了问题或如何修复它。当我尝试添加
单元格时出现问题,但我不确定原因

use std::cell::Cell;

struct Bar<'a> {
    bar: &'a str,
}
impl<'a> Bar<'a> {
    fn new(foo: &'a Foo<'a>) -> Bar<'a> { Bar{bar: foo.raw} }
}

pub struct Foo<'a> {
    raw: &'a str,
    cell: Cell<&'a str>,
}
impl<'a> Foo<'a> {
    fn get_bar(&self) -> Bar { Bar::new(&self) }
}
首先,解决方案:

use std::cell::Cell;

struct Bar<'a> {
    bar: &'a str,
}
impl<'a> Bar<'a> {
    fn new(foo: &Foo<'a>) -> Bar<'a> { Bar{bar: foo.raw} }
}

pub struct Foo<'a> {
    raw: &'a str,
    cell: Cell<&'a str>,
}
impl<'a> Foo<'a> {
    fn get_bar(&self) -> Bar<'a> { Bar::new(&self) }
}
使用std::cell::cell;
结构条{
fn新(foo:&foo{Bar{Bar:foo.raw}
}
pub结构Foo Foo{Bar::new(&self)}
}
您的代码中有两个问题。第一个问题是
get\u bar
,您没有指定返回类型的生存期。当您没有在签名中指定生存期时,Rust不会推断正确的生存期,它只是根据简单的规则盲目地填充它们。在这种特定情况下,您得到的是有效的
fn get_条形码


换言之:
get_bar
的问题在于您没有编写足够的约束;
bar::new
的问题在于您编写了太多的约束。

DK解释了缺少哪些约束以及原因,但我想我应该在添加
单元格之前解释代码为什么工作。结果是由于

如果将推断的生存期添加到原始代码中,并将生存期变量重命名为唯一,则

struct Bar<'b> {
    bar: &'b str,
}
impl<'b> Bar<'b> {
    fn new(foo: &'b Foo<'b>) -> Bar<'b> { Bar{bar: foo.raw} }
}

pub struct Foo<'a> {
    raw: &'a str,
    cell: Cell<&'a str>,
}
impl<'a> Foo<'a> {
    fn get_bar<'c>(&'c self) -> Bar<'c> { Bar::new(&self) }
}
结构栏{
fn新(foo:&b foo{Bar{Bar:foo.raw}
}

发布结构Foo Foo(&'c self)->Bar
可隐式转换为
&Foo@Antimony我不确定,但我认为这与
单元格
的内部易变性有关,这可能会影响包含类型的生存期变化。将易变性加入混合会使借阅检查器更严格。我会给出更全面的答案,但这是o有一点我自己不太清楚。说得好。我忘了方差推断。这可能就是答案。