Rust 当借用者作用域结束时,无法借用变量

Rust 当借用者作用域结束时,无法借用变量,rust,Rust,我不明白为什么可变借用变量在借用者的作用域结束后仍然被借用。这似乎与特质使用有关,但我不明白为什么: fn main() { let mut a = 10; test::<FooS>(&mut a); println!("out {:?}", a) } trait Foo<'a> { fn new(data: &'a mut u32) -> Self; fn apply(&mut self); }

我不明白为什么可变借用变量在借用者的作用域结束后仍然被借用。这似乎与特质使用有关,但我不明白为什么:

fn main() {
    let mut a = 10;
    test::<FooS>(&mut a);
    println!("out {:?}", a)
}

trait Foo<'a> {
    fn new(data: &'a mut u32) -> Self;
    fn apply(&mut self);
}

struct FooS<'a> {
    data: &'a mut u32,
}

impl<'a> Foo<'a> for FooS<'a> {
    fn new(data: &'a mut u32) -> Self {
        FooS { data: data }
    }

    fn apply(&mut self) {
        *self.data += 10;
    }
}

fn test<'a, F>(data: &'a mut u32)
    where F: Foo<'a>
{
    {
        // let mut foo = FooS {data: data}; // This works fine
        let mut foo: F = Foo::new(data);
        foo.apply();
    } // foo scope ends here
    println!("{:?}", data); // error
} // but borrowed till here
fn main(){
设muta=10;
测试::(&mut a);
println!(“out{:?}”,a)
}
自我特质;
fn应用(&mut self);
}
用于FooS Self的结构FooS{
FooS{data:data}
}
fn应用(&M自我){
*自我数据+=10;
}
}

fn testtest
函数要求type
F
实现
Foo
,因此您最终在
test
中调用
test::
,而不是在
main
中,因此它将选择从
let
语句末尾延伸到块末尾的块后缀,这意味着
数据的下一次借用不重叠,也没有冲突

您真正想要的是在每个可能的生命周期中
F
实现
Foo


当然,您不能删除
FooS
上的生存期参数,因为它包含借用的指针。这个问题的正确解决方案是Rust还没有的一个特性:将类型构造函数(而不是完全构造的类型)作为泛型参数传递给函数的能力。有了这个功能,我们可以使用
FooS
调用
test
,这是一个类型构造函数,需要一个生存期参数来生成具体类型,而无需在调用站点指定具体的生存期,调用方将能够提供自己的生存期。

有效。所以…尽管如此,这似乎是一个错误。谢谢你的详细回答。对我来说还有一个不清楚的时刻。正如您所说的“生命周期参数总是表示比函数调用寿命长的生命周期,并且为了进行借用检查(这是函数的局部检查),编译器认为借用覆盖了整个函数调用。”。为什么编译器编译器会考虑这个问题?我们有比函数范围更长的生命周期。但是它如何与整个函数调用相关呢?它是实现的细节还是规范的一部分?目前还没有关于锈病的合适的“规范”,所以实现是最接近规范的东西。有关其他问题,请参见我的编辑。
let mut foo = FooS {data: data};
fn test<'a, F>(data: &'a mut u32)
    where F: for<'x> Foo<'x>
{
    {
        let mut foo: F = Foo::new(data);
        foo.apply();
    }
    println!("{:?}", data);
}
impl<'a> Foo<'a> for FooS {