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
函数要求typeF
实现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 {