![](/img/trans.png)
[英]Why does Option<String>.as_ref() not deref to Option<&str>?
[英]Why is String -> &str different in the impl for Deref and AsRef?
為什么ops::Deref
將String
轉換為&str
與AsRef
不同?
這是ops::Deref
中的實現
impl ops::Deref for String {
type Target = str;
#[inline]
fn deref(&self) -> &str {
unsafe { str::from_utf8_unchecked(&self.vec) }
}
}
這與AsRef
不同,
impl AsRef<str> for String {
#[inline]
fn as_ref(&self) -> &str {
self
}
}
.as_ref()
和.deref()
之間有什么區別
由於類型強制規則,您可以在詢問&str
的地方放置一個&String
:
&T or &mut T to &U if T implements Deref<Target = U>
在這種情況下,
T
是String
,U
是str
。impl ops::Deref for String { type Target = str; #[inline] fn deref(&self) -> &str { unsafe { str::from_utf8_unchecked(&self.vec) } } }
如您所見,此規則依賴於特征Deref
。 這就是 @user4815162342 所說as_ref() relies on deref() to do the actual work
。
有關類型強制的更多信息,請參閱強制類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.