返回

Rust 语言实战笔记 - 方法的定义与使用

后端

方法的使用

从面向对象语言过来的同学对于方法肯定不陌生,class 里面就充斥着方法的概念。在 Rust 中,方法的概念也大差不差,往往和对象成对出现:

例子一:读写文件

例如读取一个文件写入缓冲区,如果用函数的写法:

read(f.read() == Ok(0) {
  // ...
}

上面的代码在 Rust 中是不行的,因为 read() 对于 File 对象来说是一个方法,而非函数。因此,要使用 read() 方法,需要显式地指定对象。例如:

f.read() == Ok(0) {
  // ...
}

例子二:字符串切片

Rust 的 String 类型也是一个对象,它提供了很多方法,其中一个就是 slice() 方法,它可以对字符串进行切片操作。例如,如果想获取字符串的前三个字符,可以使用如下代码:

let string = "Hello, world!".to_string();
let substring = string.slice(0..3);
assert_eq!(substring, "Hel");

方法的定义

Rust 中的方法可以通过 impl 来定义。例如,如果想为 File 对象定义一个名为 read_to_string() 的方法,可以如下操作:

impl File {
  fn read_to_string(&self) -> Result<String, std::io::Error> {
    let mut buffer = String::new();
    self.read_to_string(&mut buffer)?;
    Ok(buffer)
  }
}

在这个例子中,read_to_string() 方法接受一个可变字符串缓冲区作为参数,并将文件的内容读入该缓冲区中,然后返回一个字符串。

方法也可以定义在结构体的外面,Rust 允许将方法定义在结构体的外面,这种方法被称为 关联函数 。例如,我们可以将 read_to_string() 方法定义为一个关联函数:

impl File {
  fn read_to_string(self) -> Result<String, std::io::Error> {
    let mut buffer = String::new();
    self.read_to_string(&mut buffer)?;
    Ok(buffer)
  }
}

关联函数与普通方法的区别在于,关联函数不需要显式地指定对象,只需要直接调用即可。例如:

let string = File::read_to_string("path/to/file.txt")?;

方法的调用

方法可以通过点运算符 (.) 来调用。例如,如果想调用 File 对象的 read_to_string() 方法,可以如下操作:

let file = File::open("path/to/file.txt")?;
let string = file.read_to_string()?;

方法也可以通过链式调用来使用。例如,可以将 read_to_string() 方法与 lines() 方法一起使用,以按行读取文件的内容:

let file = File::open("path/to/file.txt")?;
let lines = file.read_to_string()?.lines();

总结

Rust 中的方法和面向对象语言中的方法非常相似。它们都允许你对对象进行操作,并提供了一种组织和重用代码的方式。方法可以通过 impl 关键字来定义,也可以定义在结构体的外面作为关联函数。方法可以通过点运算符 (.) 来调用,也可以通过链式调用来使用。