集册 Rust 中文教程 AsRef, AsMut

AsRef, AsMut

—— AsRef 和 AsMut

欢马劈雪     最近更新时间:2020-08-04 05:37:59

357

std::convert 下面,还有另外两个 Trait,AsRef/AsMut,它们功能是配合泛型,在执行引用操作的时候,进行自动类型转换。这能够使一些场景的代码实现得清晰漂亮,大家方便开发。

AsRef

AsRef 提供了一个方法 .as_ref()

对于一个类型为 T 的对象 foo,如果 T 实现了 AsRef<U>,那么,foo 可执行 .as_ref() 操作,即 foo.as_ref()。操作的结果,我们得到了一个类型为 &U 的新引用。

注:

  1. Into<T> 不同的是,AsRef<T> 只是类型转换,foo 对象本身没有被消耗;
  2. T: AsRef<U> 中的 T,可以接受 资源拥有者(owned)类型,共享引用(shared referrence)类型 ,可变引用(mutable referrence)类型。

下面举个简单的例子:

fn is_hello<T: AsRef<str>>(s: T) {
   assert_eq!("hello", s.as_ref());
}

let s = "hello";
is_hello(s);

let s = "hello".to_string();
is_hello(s);

因为 String&str 都实现了 AsRef<str>

AsMut

AsMut<T> 提供了一个方法 .as_mut()。它是 AsRef<T> 的可变(mutable)引用版本。

展开阅读全文