本文简要介绍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 AsRawFd.as_raw_fd用法及代码示例
- Rust AsFd.as_fd用法及代码示例
- Rust AsHandle.as_handle用法及代码示例
- Rust AsMut用法及代码示例
- Rust AssertUnwindSafe用法及代码示例
- Rust AsciiExt用法及代码示例
- Rust AtomicU8.fetch_sub用法及代码示例
- Rust AtomicPtr.compare_exchange_weak用法及代码示例
- Rust AtomicU32.fetch_min用法及代码示例
- Rust AtomicI8.fetch_or用法及代码示例
- Rust AtomicI8.as_mut_ptr用法及代码示例
- Rust AtomicU8.fetch_or用法及代码示例
- Rust AtomicUsize.load用法及代码示例
- Rust AtomicI16.fetch_min用法及代码示例
- Rust AtomicI16.fetch_and用法及代码示例
- Rust AtomicU16.into_inner用法及代码示例
- Rust AtomicI16.fetch_nand用法及代码示例
- Rust AtomicI32.compare_exchange用法及代码示例
- Rust AtomicU16.from_mut用法及代码示例
- Rust AtomicI16.swap用法及代码示例
- Rust AtomicU8.as_mut_ptr用法及代码示例
- Rust AtomicBool.fetch_update用法及代码示例
- Rust AtomicU32.fetch_max用法及代码示例
- Rust AtomicI64.from_mut用法及代码示例
- Rust Arc.assume_init用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::convert::AsRef。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
