面试题答案
一键面试- 移动语义的体现:
- 在Rust中,当调用
take_number(num);
时,num
的所有权被移动到了take_number
函数中。因为i32
是实现了Copy
trait的类型,但这里的传递仍然触发了移动语义。take_number
函数现在拥有了num
的值,从内存角度看,num
的值被“搬移”到了函数take_number
的栈帧中(概念上)。这意味着num
原本所在的栈空间中的值被拿走供take_number
函数使用。
- 在Rust中,当调用
- 后续尝试使用
num
的情况及原因:- 如果后续再尝试使用
num
,编译器会报错。例如:
fn take_number(num: i32) { } fn main() { let num = 5; take_number(num); println!("{}", num); // 这行代码会报错 }
- 原因是Rust的所有权系统规定,一个值在同一时刻只能有一个所有者。当
num
的所有权被移动到take_number
函数后,main
函数中的num
变量不再拥有其值的所有权。尝试使用一个已经失去所有权的变量会导致编译错误,错误信息类似于use of moved value: 'num'
,这是为了保证内存安全,防止悬空引用等问题。虽然i32
类型实现了Copy
,但默认传递仍然是移动语义,若要使用Copy
语义,可以显式地复制值,如take_number(num.clone());
后,num
仍然可以在main
函数后续使用。
- 如果后续再尝试使用