我想創建一個映射一個特徵,定義如下的方法創建鏽對象安全的特質:與接受封閉
pub trait Map<K: Sync, V> {
fn put(&mut self, k: K, v: V) -> Option<V>;
fn upsert<U: Fn(&mut V)>(&self, key: K, value: V, updater: &U);
fn get<Q: ?Sized>(&self, k: &Q) -> Option<V> where K: Borrow<Q>, Q: Eq + Hash + Sync;
// other methods ommited for brevity
}
現在的問題是,如果我實現了這個特質,例如作爲MyHashMap,然後我不能有一個這樣的表達式:
let map: Box<Map<i32, i32>> = Box::new(MyHashMap::<i32, i32>::new());
該錯誤將是:
性狀
map::Map
不能製成物體
如何解決這個問題?因爲直接開始使用Map實現並不是一個好主意,因爲這不是一個好的軟件工程實踐。
主要問題是得到和upsert方法在trait中接受泛型類型參數。我的第一個嘗試是擺脫這些泛型類型參數。
對於得到方法,這是可能的,即使它從共同特徵得到生鏽收藏偏離並使其使用方案較爲有限。下面是結果:
pub trait Map<K: Sync, V> {
fn put(&mut self, k: K, v: V) -> Option<V>;
fn upsert<U: Fn(&mut V)>(&self, key: K, value: V, updater: &U);
fn get(&self, k: &K) -> Option<V>;
// other methods ommited for brevity
}
不過,我沒有要刪除的泛型類型參數UPSERT過程中的任何想法。
有關如何處理此問題的任何想法?
*因爲直接開始使用Map實現並不是一個好主意,因爲它不是一個好的軟件工程實踐。* =>您需要更新您的工程實踐。在Rust或C++等本地語言中,使用具體實例(和泛型)而不是接口可以使編譯器擠出最後一盎司的性能。 –