gpt4 book ai didi

rust - 关于 Rust 的函数参数和所有权的一个小问题

转载 作者:行者123 更新时间:2023-12-04 11:39:29 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Do mutable references have move semantics?

(1 个回答)


4 个月前关闭。




这是我的问题:

fn main() {
let mut s = String::from("hello");
let s1 = &mut s;
let s2 = s1;

*s2 = String::from("world1");
*s1 = String::from("world2");

println!("{:?}", s);
}
它会导致编译错误,因为 s1 的类型是 &mut String 它没有实现 Copy 特征。
但是,如果我更改代码如下:
fn c(s: &mut String) -> &mut String {
s
}

fn main() {
let mut s = String::from("hello");
let s1 = &mut s;
let s2 = c(s1);

*s2 = String::from("world1");
*s1 = String::from("world2");

println!("{:?}", s);
}
它将编译而没有任何错误消息。
我知道当一个引用传递给一个函数时,它意味着引用 borrows 值(value)而不是拥有它。
但是在上面的情况下,好像当 s1 被传递给 fn c 并立即返回,s2 borrowed s1 所以 s1 不能被取消,直到 s2 超出它的生命周期范围。
那么当 s1 传入 时发生了什么fn c ?

最佳答案

根据@Denys Séguret 的提示,我猜当 s1 被传递给 fn C , Rust core编译参数 s1 类似于 &mut *s1 ,所以有一个不可变的 s1 借用。
这就是为什么如果我们把

*s2 = String::from("world1");
在后面
*s1 = String::from("world2");
Rust 会告诉我们:
assignment to borrowed `*s1`
当 s2 超出它的生命周期范围时,s1 不再借用,因此 s1 可以再次取消引用。
但我不太确定这是否是一个正确的解释。

关于rust - 关于 Rust 的函数参数和所有权的一个小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67937706/

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