代码之家  ›  专栏  ›  技术社区  ›  sigurd4

在Rust中制造负面特征,与Sized(Unsize)相反

  •  1
  • sigurd4  · 技术社区  · 3 年前

    我想我需要一个与 Sized 。任何不是 大小 应该有这个特点。我需要这样做,以避免在我的代码中以不同的方式专门针对大小类型和非大小类型的另一个特性时实现冲突。使用 ?Sized 在这种情况下不起作用,因为这会导致实现冲突。

    为此,我定义了一个自动特征,然后为 T 在以下情况下 T: Sized .

    我每晚都在使用带有功能的铁锈 auto_traits negative_impls 在中打开 main.rs :

    #![feature(auto_traits)]
    #![feature(negative_impls)]
    

    出于某种原因 dyn Any 不执行 Unsized ,尽管也没有实施 大小 .有什么隐含的吗 大小 自动实现中的需求还是什么?理想情况下,我希望每种类型都能扩展 大小 未定尺寸 没有重叠。

    use std::any::Any;
    
    use static_assertions::assert_impl_one;
    
    pub auto trait Unsized {}
    
    impl<T> !Unsized for T
    where
        T: Sized
    {
        
    }
    
    assert_not_impl_any!(dyn Any: Sized); // Succeeds! -> dyn Any is not Sized, as expected.
    assert_impl_one!(dyn Any: Unsized); // Fails! -> dyn Any is not Unsized either??? It should be.
    

    为什么这个特性 未定尺寸 没有为明显不是的事情实现 大小 ?

    删除否定实现会产生相同的断言结果。 dyn任意 仍然不是 未定尺寸 .

    1 回复  |  直到 3 年前
        1
  •  6
  •   Chayim Friedman    3 年前

    自动特征不会为dyn特征实现,除非它们明确选择加入( dyn Any + Sync , dyn Any + Unsized ).

    原因是,如果我们考虑 dyn Trait 因为它没有关于实际类型的信息。通常,我们想要的是底层类型实现auto-trait,而不是 dyn Trait 它本身考虑 Sync ,例如:我们无法判断 dyn Any 同步 或者没有,因为我们不知道它包含什么数据。只有实际类型可以是 同步 或者不。这就是为什么 dyn Trait 永远不要实现自动特性,除非用户明确表示它将只带来实现它的类型( dyn Trait + AutoTrait ).

    推荐文章