关于Rustlings move_semantics3.rs解决方案的困惑
Rust move_semantics3.rs 练习疑问解答
先给你掰明白核心逻辑:
- 当
vec0传入fill_vec时,发生了所有权转移(move)——vec0的所有权完全交给了函数的参数变量vec,之后main里的vec0就彻底失效了,你再尝试使用它编译器会直接报错。 - 函数参数里的
mut,管的是函数内部的这个vec变量是否可变,和原来的vec0有没有mut半毛钱关系都没有。你可以把它理解成:别人把一个不能拆的盒子送给你,你拿到手后给自己贴个“允许拆改”的标签,就能往里面塞东西了——原主人的盒子能不能改不重要,现在盒子是你的,你说了算。
回到代码里:
原函数参数vec: Vec<i32>,内部调用vec.push(88)时,因为vec是不可变变量,所以编译失败。改成mut vec: Vec<i32>后,函数内部的vec变成了可变变量,允许调用push方法修改数据,而vec0传入时只是完成所有权转移,完全符合Rust的规则。
再补个关键知识点:mut是变量的属性,不是数据的属性。也就是说,不是数据本身可变不可变,而是持有数据的变量有没有权限去修改它。当所有权转移后,新的变量可以通过mut声明获得修改权限,哪怕原变量是不可变的。
内容的提问来源于stack exchange,提问作者Oliver Wagner
相关产品推荐
相关产品推荐

