用途
std::convert::AsRef 和 std::convert::AsMut 用于非常方便且低成本的将类型(types)转换为引用(references)。
比如有类型 A 和 B ,则
impl AsRef<B> for A
表示 &A 可以转换为 &B。
同样:
impl AsMut<B> for A
表示 &mut A 可以转换为 &mut B`。
这种方式可以在类型转换的时候,避免值的拷贝和移动。比如标准库里的 std::fs::File.open() 方法定义如下:
fn open<P: AsRef<Path>>(path: P) -> Result<File>
这种定义方式,File.open() 除了可以接收 Path 类型的参数,还可以接收 OsStr、 OsString、 str、 String 以及 PathBuf 等类型的参数,因为这些类型都实现了 AsRef<Path>, 都可以隐式转换为 Path 类型。
实现
std::convert::AsRef 是一个 Trait
比如 为String类型实现AsRef<Path> 的代码如下:
impl AsRef<Path> for String {
fn as_ref(&self) -> &Path {
Path::new(self)
}
}
看起来很简单。
VS From Trait
AsRef 是引用到引用(reference-to-reference)的转换,因此成本低。与此相对, From 是值到值(value-to-value)的转换,因此成本会比较高。