我想我需要一种与Sized相反的trait .任何不是Sized的东西都应该具有这一特征.我需要这样做,以避免在我的代码中为大小类型和非大小类型以不同方式专门化另一个特征时的冲突实现.在这种情况下使用?Sized不起作用,因为它会导致冲突的实现.

为此,我定义了一个自体特征,然后在T: Sized的情况下对T进行了负影响.

我每晚都在使用铁 rust ,main.rs中打开了功能auto_traitsnegative_impls:

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

由于某种原因,dyn Any没有实现Unsized,尽管也没有实现Sized.在自动实现中有隐含的Sized要求吗?理想情况下,我希望每种类型要么扩展为Sized,要么扩展为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.

为什么特征Unsized不适用于明显不是Sized的事物?

删除否定的实现会产生相同的断言结果.dyn Any仍然不是Unsized.

推荐答案

自动特征不会被实现为dyn特征,除非他们显式地 Select 它们(dyn Any + Sync,dyn Any + Unsized).

原因是,如果我们考虑dyn Trait本身,汽车特征几乎没有价值,因为它没有关于实际类型的信息.通常,我们需要的是基础类型实现自动特征,而不是dyn Trait本身.以Sync为例:我们不知道dyn Any是不是Sync,因为我们不知道它包含什么数据.只有实际类型可以是Sync或不是.这就是为什么dyn Trait从不实现自动特征,除非用户显式地说它只会带来实现它的类型(dyn Trait + AutoTrait).

Rust相关问答推荐

rust 蚀将动力特性浇到混凝土 struct 上是行不通的

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

在泛型 struct 的字段声明中访问关联的Conant

铁 rust 中的共享对象实现特征

使用Box优化可选的已知长度数组的内存分配

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

有没有一种惯用的方法来判断VEC中是否存在变体?

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

不能在Rust中使用OpenGL绘制三角形

如何将生存期参数添加到框<>;具有dyn类型别名

使用 select 处理 SIGINT 和子等待!无阻塞

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

Rust 中指向自身的引用如何工作?

为什么Rust编译器会忽略模板参数应具有静态生命周期?

是否可以通过可变引用推进可变切片?

如何在 Rust 中将 Vec> 转换为 Vec>?

为什么 File::read_to_end 缓冲区容量越大越慢?

为什么指定生命周期让我返回一个引用?