面试题答案
一键面试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
}
}
所有权转移和管理解释
append
方法:append
方法接受&mut self
,这意味着它获取结构体StringBuilder
的可变借用。- 因为是可变借用,所以可以修改结构体内部的
data
字段。这里调用push_str
方法将传入的&str
追加到data
中。 - 最后返回
&mut StringBuilder
,也就是返回自身的可变借用,这样就可以进行链式调用。由于是借用,结构体的所有权仍然属于调用者,没有发生所有权转移。
build
方法:build
方法接受self
,这意味着它获取结构体StringBuilder
的所有权。- 方法内部直接返回结构体中的
data
字段,将data
的所有权转移出去。 - 由于
build
方法获取了StringBuilder
的所有权,调用build
后,原来的StringBuilder
实例不再有效,因为所有权已经被转移走,从而完成了从StringBuilder
到返回的String
的所有权转移。
通过这种方式,append
和build
方法既实现了链式调用,又合理地处理了所有权和借用关系。