繁体   English   中英

为什么 String -> &str 在 Deref 和 AsRef 的实现中不同?

[英]Why is String -> &str different in the impl for Deref and AsRef?

为什么ops::DerefString转换为&strAsRef不同?

这是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>

在这种情况下, TStringUstr

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM