Rust中Vector的借用疑问:非借用与借用差异及元素修改方法
Rust代码问题解答
先贴出原代码:
fn main() { let mut numbers = vec![1, 3, 5, 2, 8, 1]; // 1 - non-borrow let mut largest = numbers[0]; largest = 20; println!("{} {}", numbers[0], largest); // 2 - borrow let mut largest = &numbers[0]; largest = &30; println!("{} {}", numbers[0], largest); }
问题解答
1. 非借用操作与借用操作的区别,仅影响类型吗?
不止是类型区别,核心是所有权与值的独立性:
- 非借用:
let mut largest = numbers[0];是把numbers[0]的值拷贝给largest,此时largest是独立的i32变量,拥有自身所有权。修改largest只会改变这个变量本身,完全不影响原vector里的元素,原numbers[0]始终是1。 - 借用:
let mut largest = &numbers[0];是创建指向numbers[0]的不可变引用,largest类型为&i32,它不拥有值的所有权,只是借用原值的访问权。这段代码里后续把largest重新绑定到&30,本质是更换了引用的目标,也没修改原vector,但如果用可变引用,就能直接操作原vector的元素。
2. 为何largest需要借用字面量值?
因为largest的类型是&i32(不可变引用),Rust要求赋值时类型必须严格匹配。字面量30的类型是i32,直接赋值会触发类型不匹配的编译错误,所以必须用&30将其转换为&i32类型的引用。Rust会自动把字面量存入静态内存区域,&30是合法的静态生命周期引用,可以安全赋值。
3. 是否可实际引用Vector中的第一个值并对其进行修改?
可以,但需要使用可变引用,同时遵循Rust的借用规则。修改后的示例代码:
fn main() { let mut numbers = vec![1, 3, 5, 2, 8, 1]; // 创建可变引用 let largest = &mut numbers[0]; // 通过解引用操作修改原vector的元素 *largest = 30; println!("{}", numbers[0]); // 输出30 }
注意:同一时间只能存在一个可变引用,或者多个不可变引用,不能同时存在可变和不可变引用,这是Rust保证内存安全的核心规则。
内容的提问来源于stack exchange,提问作者rhughes
相关产品推荐
相关产品推荐

