有没有可能让一个带有泛型参数的函数将该参数转换为带有泛型trait的Arc
?
struct Foo<TypeOrTrait> {
arc: Option<Arc<TypeOrTrait>>,
}
impl<TypeOrTrait> Foo<TypeOrTrait> {
fn set<T>(&mut self, t: T) -> Arc<T> {
let arc = Arc::new(t);
self.arc = Some(arc.clone()); // Error
arc
}
}
代码抱怨无法将Arc<T>
转换为Arc<TypeOrTrait>
。
在我的代码中,我没有 Package TypeOrTrait
的Arc
,而是一个复杂的Arc<RwLock<Inner<TypeOrTrait>>>
,所以我不能通过将Arc<TypeOrTrait>
传递给set
函数来解决这个问题。
我的用例是,我希望有一个集合只实现一个trait,但也希望有一种方法来访问/修改使用其原始类型的值。
let foo: Foo<fmt::Display> = Foo { arc: None };
let value = foo.set(1u8);
assert_eq!(*value, 1u8);
assert_eq!(foo.bar.unwrap().to_string(), "1");
let value = foo.set(2u16);
assert_eq!(*value, 2u16);
assert_eq!(foo.bar.unwrap().to_string(), "2");
我被告知这将需要更高的类型,是这样吗?如果是这样的话,它可以被模仿的东西一样,他们做here(我的 rust fu是不是在同一水平)?
1条答案
按热度按时间ep6jt1vc1#
如果您只有很少的trait和类型,您可以使用自定义trait:
如果你有很多特性或者类型......嗯......我想你没有解决方案,你几乎可以在nightly上使用
std::marker::Unsize
,但是不能,因为你想在两种情况下都使用相同的类型。