本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。