簡體   English   中英

為什么 Rust 阻止為外部結構實現外部特征?

[英]Why does Rust prevent implementing an external trait for an external struct?

我剛剛遇到了為我不擁有的類型實現我不擁有的特征的問題。 然后我用谷歌搜索了我如何為我不擁有的類型實現我不擁有的特征? 問題。

讓我感到困惑的是這種限制背后的動機。 我來自 Scala,在那里可以有一個外部類型的外部類型實例。

為什么 Rust 會限制它?

正如 Alexey Larionov 在評論中解釋的那樣,如果兩個 crate 可以為同一個結構實現一個 trait,那么使用哪個 trait 實現就會發生沖突。 有了這個限制,Rust 保證每個 (struct, trait) 對在所有 crate 中最多有一個實現。

如果您發現自己需要為外部結構實現外部特征,您可以利用Rust New Type Idiom

通過將外部結構包裝在新類型中,您可以在該新類型上實現任何外部特征。

雖然新類型與外部結構不同,但您可以使用.0語法引用該包裝類型,如 New Type Idiom 文檔中所述。

我剛剛閱讀了Rust Book關於實現特征的章節,正如@AlexLarionov 在評論中建議的那樣,不可能選擇合適的實現:

但是我們不能在外部類型上實現外部特征。 例如,我們不能在我們的聚合器板條箱中實現Vec<T>Display特征,因為DisplayVec<T>是在標准庫中定義的,並且不是我們的聚合器板條箱本地的。 這個限制是程序屬性的一部分,稱為連貫性,更具體地說是孤兒規則,之所以這樣命名是因為父類型不存在。 此規則確保其他人的代碼不會破壞您的代碼,反之亦然。 如果沒有這個規則,兩個 crate 可以為相同的類型實現相同的 trait,並且 Rust 不知道使用哪個實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM