面试题答案
一键面试以下是用 Rust 语言实现的代码示例以及对所有权规则和 FnOnce
闭包的解释:
struct MyStruct {
internal_state: i32,
}
fn modify_and_transfer(mut s: MyStruct, f: impl FnOnce(&mut MyStruct)) -> MyStruct {
f(&mut s);
s
}
所有权规则解释
- 结构体所有权转移:函数
modify_and_transfer
接受MyStruct
类型的参数s
,这意味着s
的所有权被转移到函数内部。 - 闭包参数借用:闭包
f
接受&mut MyStruct
类型的参数,这是对结构体的可变借用。因为闭包只是借用结构体,而不是获取所有权,所以函数内部可以在闭包调用后继续使用结构体。 - 函数返回所有权:函数
modify_and_transfer
返回MyStruct
类型的结构体s
,这意味着s
的所有权被转移出函数。
FnOnce
闭包适应场景解释
FnOnce
特性:FnOnce
闭包表示该闭包可以被调用一次,调用后闭包会消耗自身。在这个场景中,FnOnce
闭包可以对结构体的内部状态进行修改,并且在调用后不会再被使用。- 适应所有权转移:由于
FnOnce
闭包可以消耗自身,所以它可以在函数内部对结构体进行修改,并且在函数返回时,结构体的所有权可以被顺利转移出函数。这符合函数调用结束后结构体所有权被转移出函数的要求。
通过上述代码和解释,可以看到如何在 Rust 中利用 FnOnce
闭包对结构体内部状态进行修改,并实现结构体所有权的转移。