面试题答案
一键面试Rust的所有权规则
- 每个值都有一个变量作为其所有者:在Rust中,每个值在内存中有且仅有一个所有者。例如:
let s = String::from("hello");
这里s
是String
类型值"hello"
的所有者。
2. 值在任一时刻有且只有一个所有者:不能同时有两个变量拥有同一个值的所有权。例如以下代码会报错:
let s1 = String::from("hello");
let s2 = s1; // s1的所有权转移给了s2,此时s1不再拥有该值,若再使用s1会报错
// println!("{}", s1); // 这行代码会报错,因为s1已失去所有权
- 当所有者离开作用域,这个值将被丢弃:当变量离开其作用域(scope)时,Rust会自动调用
drop
函数来清理该变量所拥有的值占用的资源。例如:
{
let s = String::from("world"); // s进入作用域
// 在这里可以使用s
} // s离开作用域,Rust自动调用drop函数释放s所占用的资源
简单函数调用场景中所有权的转移和生效
fn take_ownership(some_string: String) {
println!("{}", some_string);
} // some_string离开作用域,被丢弃
fn main() {
let s = String::from("hello, world");
take_ownership(s); // s的所有权转移给函数take_ownership中的参数some_string
// println!("{}", s); // 这行代码会报错,因为s的所有权已转移
}
在上述代码中,main
函数中创建了String
类型的变量s
。当调用take_ownership
函数并传递s
时,s
的所有权转移给了函数参数some_string
。此时在main
函数中s
不再拥有该字符串的所有权,若尝试访问s
会导致编译错误。而在take_ownership
函数中,some_string
成为该字符串的所有者,当函数执行完毕,some_string
离开作用域,其所拥有的字符串资源被释放。