我知道这是因为object safety:

物体安全特性可以是trait object的基本特性.如果一个性状具有以下品质(在RFC 255中定义),则该性状为object safe:

  • ...
  • 它不能有任何关联的常量.

但是,如果关联的常量声明为specific value,为什么Rust仍然不支持它?下面是一个例子:

trait Trait {
    const A: i32 = 64;
}

fn fun(t: Box<dyn Trait>) -> bool {
    return  true;
}

我想使用一个函数返回一个常量值,并故意省略&self参数,但它仍然不起作用.以下是代码:

trait Trait {
    fn getA() -> i32 {
        64
    }
}

fn fun(t: Box<dyn Trait>) -> bool {
    return  true;
}

Rust不支持它有什么低级原因吗?或者仅仅是因为RFC规则?

推荐答案

它们不是对象安全的,因为特征实现者的常量值可能不同:

trait Foo {
    const A: i32 = 4;
}

impl Foo for bool {
    const A: i32 = 5;
}

(dyn Foo)::A应该产生什么样的价值?

通过使用dyn Foo,原始类型被擦除,并且在没有指向dyn Foo值的指针/引用的情况下,没有可以参考的vtable.没有self参数的特征方法也存在同样的问题.

为此,您需要常规的泛型:

trait Trait {
    const A: i32 = 64;
}

fn fun<T: Trait>(t: T) -> i32 {
    T::A
}

Rust相关问答推荐

如何从使用mockall模拟的方法中返回self?

如何从接收&;self的方法克隆RC

有没有办法模仿对象安全克隆?

这种获取-释放关系是如何运作的?

防止cargo test 中的竞争条件

如何在 struct 的自定义序列化程序中使用serde序列化_WITH

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

如何在AVX2中对齐/旋转256位向量?

返回Result<;(),框<;dyn错误>>;工作

try 实现线程安全的缓存

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

中文优化标题:跳出特定循环并返回一个值

borrow 匹配手臂内部的可变

rust tokio::spawn 在 mutexguard 之后等待

类型判断模式匹配panic

在 Rust 中返回对枚举变体的引用是个好主意吗?

为实现特征的所有类型实现显示

提取 struct 生成宏中字段出现的索引

为什么在使用 self 时会消耗 struct 而在解构时不会?