面试题答案
一键面试- 代码编译通过原因:
- Rust 有严格的所有权和借用规则。在这段代码中,
vec1.clone()
创建了vec1
的一个新的独立副本vec2
。clone
方法会深度复制vec1
中的所有元素到vec2
,这意味着vec2
有自己独立的内存空间来存储这些元素。 - 接着
let ref1 = &vec1;
创建了对vec1
的一个不可变引用ref1
。虽然之后vec1.push(4);
修改了vec1
,但这个修改并不影响vec2
,因为vec2
是一个独立的副本。同时,由于vec1
是mut
可变的,且在创建不可变引用ref1
后没有再通过ref1
进行访问,所以对vec1
的修改也是符合借用规则的,因此代码能编译通过。
- Rust 有严格的所有权和借用规则。在这段代码中,
clone
方法对所有权和借用规则的遵循和影响:- 所有权:
clone
方法创建了一个新的对象(这里是vec2
),它拥有自己独立的所有权,与原始对象vec1
的所有权相互独立。这意味着修改vec1
不会影响vec2
的所有权和数据。 - 借用规则:
clone
方法本身并不涉及借用。它只是复制数据并创建新的所有权。在创建vec2
后,对vec1
的借用和修改都是符合 Rust 的借用规则的。在修改vec1
时,没有活跃的可变借用(只有不可变借用ref1
且之后未使用),所以修改操作合法。
- 所有权:
- 使
vec2
在vec1
修改后也能反映出变化的修改方法:- 可以使用
Rc
(引用计数)和RefCell
来实现。Rc
用于共享所有权,RefCell
用于在运行时检查借用规则,以允许内部可变性。
use std::cell::RefCell; use std::rc::Rc; fn main() { let shared_vec = Rc::new(RefCell::new(vec![1, 2, 3])); let vec2 = shared_vec.clone(); let ref1 = &shared_vec; shared_vec.borrow_mut().push(4); println!("{:?}", vec2.borrow()); }
- 在上述代码中,
Rc::new(RefCell::new(vec![1, 2, 3]))
创建了一个引用计数的RefCell
包裹的Vec
。vec2 = shared_vec.clone();
增加了引用计数,使得vec2
和shared_vec
共享同一个Vec
的所有权。shared_vec.borrow_mut().push(4);
通过RefCell
的borrow_mut
方法获取可变借用并修改Vec
。println!("{:?}", vec2.borrow());
通过borrow
方法获取不可变借用并打印Vec
的内容,这样vec2
就能反映出vec1
修改后的变化。
- 可以使用