当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust AsRef用法及代码示例


本文简要介绍rust语言中 Trait std::convert::AsRef 的用法。

用法

pub trait AsRef<T> where    T: ?Sized, {
    fn as_ref(&self) -> &T;
}

用于进行廉价的reference-to-reference 转换。

此 trait 类似于 AsMut 用于在可变引用之间进行转换。如果您需要进行昂贵的转换,最好使用类型&T 实现 From 或编写自定义函数。

AsRef Borrow 具有相同的签名,但 Borrow 在以下几个方面有所不同:

  • AsRef 不同, Borrow 对任何 T 都有一个全面的 impl,可用于接受引用或值。
  • Borrow 还要求借用值的 Hash Eq Ord 等于拥有值。因此,如果您只想借用结构体的单个字段,则可以实现 AsRef ,但不能实现 Borrow

注意:这个特质一定不能失败.如果转换可能失败,请使用返回的专用方法Option<T>或一个Result<T, E>.

通用实现

  • 如果内部类型是引用或可变引用,AsRef 自动取消引用(例如:如果 foo 的类型为 &mut Foo&&mut Foo,则 foo.as_ref() 的工作方式相同)

例子

通过使用特征边界,我们可以接受不同类型的参数,只要它们可以转换为指定的类型 T

例如:通过创建一个采用 AsRef<str> 的通用函数,我们表示希望接受所有可以转换为 &str 作为参数的引用。由于 String &str 都实现了 AsRef<str>,我们可以接受两者作为输入参数。

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);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::convert::AsRef。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。