rust 将泛型函数参数转换为具有泛型特征的“弧”

vuktfyat  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(135)

有没有可能让一个带有泛型参数的函数将该参数转换为带有泛型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 TypeOrTraitArc,而是一个复杂的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是不是在同一水平)?

ep6jt1vc

ep6jt1vc1#

如果您只有很少的trait和类型,您可以使用自定义trait:

pub trait ConvertArc<To: ?Sized> {
    fn convert(self: Arc<Self>) -> Arc<To>;
}

impl<T: ?Sized> ConvertArc<T> for T {
    fn convert(self: Arc<Self>) -> Arc<Self> { self }
}
impl ConvertArc<dyn Trait> for Struct {
    fn convert(self: Arc<Self>) -> Arc<dyn Trait> { self }
}

struct S<TypeOrTrait: ?Sized> {
    arc: Option<Arc<TypeOrTrait>>,
}

impl<TypeOrTrait: ?Sized> S<TypeOrTrait> {
    fn set<T: ConvertArc<TypeOrTrait>>(&mut self, t: T) -> Arc<T> {
        let arc = Arc::new(t);
        self.arc = Some(arc.clone().convert());
        arc
    }
}

如果你有很多特性或者类型......嗯......我想你没有解决方案,你几乎可以在nightly上使用std::marker::Unsize,但是不能,因为你想在两种情况下都使用相同的类型。

相关问题