MST

星途 面试题库

面试题:Rust方法生命周期链式调用中的借用规则

在Rust中,假设有一个结构体`MyStruct`,包含一个`String`类型的字段。编写一个方法链式调用的示例,要求在链式调用过程中,遵循Rust的借用规则,不产生编译错误,并解释每一步借用的生命周期是如何管理的。
12.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

impl MyStruct {
    fn new(data: &str) -> Self {
        MyStruct {
            data: data.to_string(),
        }
    }

    fn append(&mut self, new_data: &str) -> &mut Self {
        self.data.push_str(new_data);
        self
    }

    fn print_length(&self) -> &Self {
        println!("Length of data: {}", self.data.len());
        self
    }
}

可以这样使用链式调用:

fn main() {
    let mut my_struct = MyStruct::new("initial");
    my_struct
      .append(" appended")
      .print_length();
}

生命周期管理解释

  1. MyStruct::new:此方法获取一个&str类型的参数,它是一个引用,生命周期由调用者决定。在方法内部,将其转换为String类型并存储在结构体中,这一步并不涉及借用生命周期管理问题,因为data是结构体的拥有者。
  2. MyStruct::append:此方法获取&mut self,这意味着获取结构体的可变引用。因为是可变引用,在借用期间,其他任何对self的引用(无论是可变还是不可变)都不允许。此方法修改self.data,并返回&mut Self,这样就可以继续链式调用。其借用生命周期从方法调用开始,到链式调用结束。
  3. MyStruct::print_length:此方法获取&self,即结构体的不可变引用。不可变引用允许同时存在多个,但不能与可变引用同时存在。它只是读取self.data的长度并打印,不修改数据。借用生命周期同样从方法调用开始,到链式调用结束。在整个链式调用过程中,append方法获取可变引用修改数据,print_length方法获取不可变引用读取数据,严格遵循Rust的借用规则,从而避免编译错误。