MST

星途 面试题库

面试题:Rust中move关键字如何在函数调用时影响所有权转移

假设有如下Rust代码: ```rust fn main() { let s = String::from("hello"); take_ownership(s); println!("{}", s); } fn take_ownership(some_string: String) { println!("{} has been taken ownership", some_string); } ``` 请分析这段代码是否能编译通过,如果不能,原因是什么,move关键字在其中起到了怎样的作用?
37.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 代码能否编译通过及原因
    • 这段代码不能编译通过。
    • 原因在于Rust的所有权机制。在Rust中,当调用take_ownership(s)时,s的所有权被转移到了take_ownership函数中。这意味着main函数中的s不再拥有其指向的字符串数据的所有权。当执行到println!("{}", s);时,s已经没有有效的所有权,试图访问它会导致编译错误。编译器会报错类似于:use of moved value: s``,表示main函数中的s已经被移动(所有权转移),不能再使用。
  2. move关键字的作用
    • 在Rust中,虽然代码中没有显式使用move关键字,但函数参数传递默认就是move语义。
    • move关键字主要用于闭包中,强制闭包获取捕获变量的所有权。例如:
    let s = String::from("hello");
    let closure = move || println!("{}", s);
    
    • 在这个闭包中,使用move关键字,闭包closure获取了s的所有权。这在某些场景下很有用,比如当你希望闭包能够独立于定义它的作用域来拥有数据的所有权,或者你想确保闭包捕获的数据在闭包被传递到其他线程执行时,能正确地处理所有权。在给定的代码中,take_ownership函数参数传递的默认move语义使得some_string参数获取了传入的String类型变量的所有权。