我一直在使用相當多的靜態型別編程語言(C 、Haskell 等),但我對 Rust 比較陌生。
我經常寫這樣的代碼:
struct LeafNode<K: Ord Default Clone, V: Default Clone> {
keys: Vec<K>,
values: Vec<V>,
}
impl <K: Ord Default Clone, V: Default Clone> LeafNode<K, V> {
// ...
}
型別約束這里有很多重復。當LeafNode在其他事物中使用時(例如,在構建節點樹時),這會進一步復雜化。每當這些約束之一在實作程序中發生變化時,就會有許多地方需要更改代碼,因為它們在許多不同的struct定義和impl塊中被命名。
有沒有辦法從K: Ord Default Clone和創建某種“型別約束別名” V: Default Clone?
如果它存在,它可能有一些我不知道的名稱,這使得搜索這種技術非常困難。因此這個問題。
uj5u.com熱心網友回復:
您可以通過創建自己的 trait 來實作這一點,該 trait 將其他 trait 作為邊界,然后為它添加一個全面的實作:
trait MyConstraint: Ord Default Clone {}
impl <T: Ord Default Clone> MyConstraint for T {}
struct LeafNode<K: MyConstraint> {
keys: Vec<K>
}
impl<K: MyConstraint> LeafNode<K> {
fn keys(&self) -> &[K] {
&self.keys
}
}
uj5u.com熱心網友回復:
作為補充答案。
您可以使用特征別名(目前不穩定):
#![feature(trait_alias)]
trait MyConstraint = Ord Default Clone;
struct LeafNode<K: MyConstraint> {
keys: Vec<K>
}
impl<K: MyConstraint> LeafNode<K> {
fn keys(&self) -> &[K] {
&self.keys
}
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384266.html
