MST

星途 面试题库

面试题:Rust结构体方法链式调用中的所有权与借用

假设有一个Rust结构体`StringBuilder`,内部有一个`String`类型的字段`data`。为`StringBuilder`实现`append`方法,接受一个`&str`参数并将其追加到`data`中,还需要实现`build`方法返回`data`的所有权。请确保这两个方法能够进行链式调用,同时要处理好所有权和借用关系,避免出现编译错误。并解释在链式调用过程中所有权是如何转移和管理的。
49.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct StringBuilder {
    data: String,
}

impl StringBuilder {
    fn append(&mut self, s: &str) -> &mut StringBuilder {
        self.data.push_str(s);
        self
    }

    fn build(self) -> String {
        self.data
    }
}

所有权转移和管理解释

  1. append方法
    • append方法接受&mut self,这意味着它获取结构体StringBuilder的可变借用。
    • 因为是可变借用,所以可以修改结构体内部的data字段。这里调用push_str方法将传入的&str追加到data中。
    • 最后返回&mut StringBuilder,也就是返回自身的可变借用,这样就可以进行链式调用。由于是借用,结构体的所有权仍然属于调用者,没有发生所有权转移。
  2. build方法
    • build方法接受self,这意味着它获取结构体StringBuilder的所有权。
    • 方法内部直接返回结构体中的data字段,将data的所有权转移出去。
    • 由于build方法获取了StringBuilder的所有权,调用build后,原来的StringBuilder实例不再有效,因为所有权已经被转移走,从而完成了从StringBuilder到返回的String的所有权转移。

通过这种方式,appendbuild方法既实现了链式调用,又合理地处理了所有权和借用关系。