gpt4 book ai didi

rust - 从具有自链接生存期的可变引用中获取不可变引用时有什么区别?

转载 作者:行者123 更新时间:2023-12-03 11:33:37 25 4
gpt4 key购买 nike

struct Foo01<'a> {
val: u32,
str: &'a String,
}

fn mutate_and_share_01<'a>(foo: &'a mut Foo01<'a>) -> &'a Foo01<'a> {
foo
}

fn mutate_and_share_02<'a>(foo: &'a mut Foo01<'a>) -> &'a Foo01 {
foo
}

fn mutate_and_share_03<'a>(foo: &'a mut Foo01) -> &'a Foo01<'a> {
foo
}

fn main() {
let mut foo = Foo01 { val: 16, str: &String::from("Hello ") };
let foo_mut = &mut foo;

//let loan = mutate_and_share_01(foo_mut);
//let loan2 = mutate_and_share_01(foo_mut); //error

//let loan = mutate_and_share_02(foo_mut);
//let loan2 = mutate_and_share_02(foo_mut); //error

let loan = mutate_and_share_03(foo_mut);
let loan2 = mutate_and_share_03(foo_mut); //good
}
这些 mutate_and_share版本之间有什么区别?

最佳答案

在情况1和2中,您说的是函数借用结构,只要结构借用其参数即可:

foo: &'a mut Foo01<'a>


这说“foo是从'a”借来的( &'a mut),“foo是借用了 'a的参数”( Foo01<'a>)。
这意味着就rustc而言,对该函数的调用将必须永远借用输入,因为该结构在其整个生命周期中都必须借用其输入,因此您将被锁定:您无法“取消借用”输入通过删除它,使第二个调用永远无法工作。
在情况3中,您将输出的参数与内部借位相关联,这并不是真的,但至少在这种情况下效果很好。现实情况是,这两个生命周期是不相关的:
fn mutate_and_share<'a, 'b>(foo: &'a mut Foo01<'b>) -> &'a Foo01<'b> {
foo
}
另请注意,您的第三种情况仅适用,因为您从未使用过 loan,因此在执行第二行之前会立即将其删除。如果您这样做:
    let loan = mutate_and_share_03(foo_mut);
let loan2 = mutate_and_share_03(foo_mut); //good
print("{}", loan.val)
那么它就不会编译,因为可变的借位是重叠的。
哦,而且 &String通常没用。 &mut String有一些用例,但是每当您看到对 String的不变引用时,最好使用 &str。与 &Vec<T>相同,没有用,应该为 &[T]

关于rust - 从具有自链接生存期的可变引用中获取不可变引用时有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66133194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com