我想创建一个映射一个特征,定义如下的方法创建锈对象安全的特质:与接受封闭
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++等本地语言中,使用具体实例(和泛型)而不是接口可以使编译器挤出最后一盎司的性能。 –