面试题答案
一键面试- 对于
fn process_string(s: String)
:- 当调用这个函数时,所有权发生转移。调用者将
String
类型变量s
的所有权转移给process_string
函数。这意味着调用者在函数调用之后,不能再使用该变量。例如:
fn process_string(s: String) { println!("The string is: {}", s); } fn main() { let my_string = String::from("Hello"); process_string(my_string); // 这里如果尝试使用my_string,例如println!("{}", my_string); 会导致编译错误,因为所有权已转移 }
- 当调用这个函数时,所有权发生转移。调用者将
- 对于
fn process_string(s: &String)
:- 这里传递的是对
String
的引用。调用者将String
的引用传递给函数,函数不会获取String
的所有权。函数可以通过引用访问和操作String
的内容,但所有权仍归调用者所有。例如:
fn process_string(s: &String) { println!("The string is: {}", s); } fn main() { let my_string = String::from("Hello"); process_string(&my_string); println!("The original string is: {}", my_string); // 这里可以继续使用my_string,因为所有权未转移 }
- 这里传递的是对
- 变化的本质原因:
- Rust的所有权系统旨在在编译时确保内存安全。当传递
String
类型(值语义)时,所有权转移以防止内存重复释放等问题。而传递引用(&String,引用语义)时,函数只是借用数据,不会获取所有权,这样调用者仍然可以继续使用该数据,同时通过借用规则确保在同一时间只有一个可变引用或多个不可变引用,避免数据竞争。
- Rust的所有权系统旨在在编译时确保内存安全。当传递