![](/img/trans.png)
[英]How to write a trait bound for a reference to an associated type on the trait itself?
[英]Is it a convention to write ?Sized by itself as a trait bound?
在編程 Rust的第 297 頁上,您可以找到以下內容
impl HashMap<K, V> where K: Eq + Hash
{
fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
where K: Borrow<Q>,
Q: Eq + Hash
}
我以前見過這個?Sized
是自己寫的,而特征邊界的 rest 在不同的行上? 這是一個約定嗎? 據我了解,以上內容實際上與以下內容相同嗎?
impl HashMap<K, V> where K: Eq + Hash
{
fn get<Q>(&self, key: &Q) -> Option<&V>
where K: Borrow<Q>,
Q: Eq + Hash + ?Sized
}
為什么?Sized
被拆分了? 您可以在第 295 頁的類似示例中看到這一點,
...
where T: AsRef<U>
T: ?Sized, U: ?Sized
...
那是純粹的約定,它不是一成不變的,但它確實有一些優點。
如果不合適(當單態化時),特殊語法?Sized
允許編譯器刪除這個界限。 因此,為了便於閱讀,將其拆分並將其放在通用定義而不是where
子句中,並且將它與其他人不同,它不是一個嚴格、嚴格的標記這一事實分開確實是有道理的。
那里的一些庫 go 甚至進一步列出了通用定義中的所有標記,以及where
子句中的所有特征。
正如評論中所述並由@PeterHall 通過提交日志發現,在 rust 1.15 之前, ?Sized
僅作為類型定義中的特征要求提供。 此 PR將其更改為我們今天的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.