本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。