面试题答案
一键面试struct Point {
x: i32,
y: i32,
}
fn transform(p: Point) -> Point {
Point {
x: p.x * 2,
y: p.y * 2,
}
}
fn main() {
let original = Point { x: 1, y: 2 };
let transformed = transform(original);
println!("Transformed point: x = {}, y = {}", transformed.x, transformed.y);
}
在上述代码中,move
关键字并没有显式出现,但是所有权转移依然发生了。transform
函数的参数 p
通过值传递的方式接收 original
的所有权。
move
关键字的必要性和具体影响:
- 必要性:Rust 采用所有权系统来管理内存,确保内存安全。当一个值传递给函数时,默认情况下所有权会被转移,这是 Rust 内存安全机制的核心。在这里,为了确保
original
实例的内存不会被重复释放(避免悬垂指针等问题),需要转移所有权。如果不转移所有权,函数内部对p
的操作可能会与外部对original
的操作产生冲突,破坏内存安全。 - 具体影响:当
original
传递给transform
函数时,original
的所有权被转移给函数参数p
。在函数transform
内部,p
可以自由使用和修改传入的Point
实例。而在函数调用结束后,original
在main
函数中不再有效,不能再被使用,因为所有权已经转移到了函数内部并最终被新返回的Point
实例(transformed
)所持有。这样确保了同一内存区域在同一时间只有一个所有者,避免了内存安全问题。