MST

星途 面试题库

面试题:Rust中FnOnce trait闭包与所有权转移

假设有一个结构体包含一个内部状态,编写一个函数,该函数接受一个FnOnce闭包,闭包会对结构体的内部状态进行修改,且函数调用结束后结构体的所有权被转移出函数。请解释这里涉及的所有权规则以及FnOnce闭包如何适应这种场景。
28.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

以下是用 Rust 语言实现的代码示例以及对所有权规则和 FnOnce 闭包的解释:

struct MyStruct {
    internal_state: i32,
}

fn modify_and_transfer(mut s: MyStruct, f: impl FnOnce(&mut MyStruct)) -> MyStruct {
    f(&mut s);
    s
}

所有权规则解释

  1. 结构体所有权转移:函数 modify_and_transfer 接受 MyStruct 类型的参数 s,这意味着 s 的所有权被转移到函数内部。
  2. 闭包参数借用:闭包 f 接受 &mut MyStruct 类型的参数,这是对结构体的可变借用。因为闭包只是借用结构体,而不是获取所有权,所以函数内部可以在闭包调用后继续使用结构体。
  3. 函数返回所有权:函数 modify_and_transfer 返回 MyStruct 类型的结构体 s,这意味着 s 的所有权被转移出函数。

FnOnce 闭包适应场景解释

  1. FnOnce 特性FnOnce 闭包表示该闭包可以被调用一次,调用后闭包会消耗自身。在这个场景中,FnOnce 闭包可以对结构体的内部状态进行修改,并且在调用后不会再被使用。
  2. 适应所有权转移:由于 FnOnce 闭包可以消耗自身,所以它可以在函数内部对结构体进行修改,并且在函数返回时,结构体的所有权可以被顺利转移出函数。这符合函数调用结束后结构体所有权被转移出函数的要求。

通过上述代码和解释,可以看到如何在 Rust 中利用 FnOnce 闭包对结构体内部状态进行修改,并实现结构体所有权的转移。