为什么 Rust 不支持具有关联常量的特征对象?

Sim*_*ong 1 rust trait-objects associated-const

我知道这是因为对象安全:

对象安全特征可以是特征对象的基本特征。如果特征具有以下品质(在RFC 255中定义),则该特征是对象安全的:

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

但是如果用特定值声明关联常量,为什么 Rust 仍然不支持它呢?这是一个例子:

trait Trait {
    const A: i32 = 64;
}

fn fun(t: Box<dyn Trait>) -> bool {
    return  true;
}
Run Code Online (Sandbox Code Playgroud)

我想用函数返回一个常量值,故意省略&self参数,但还是不行。这是代码:

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

fn fun(t: Box<dyn Trait>) -> bool {
    return  true;
}
Run Code Online (Sandbox Code Playgroud)

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

cg9*_*909 5

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

trait Foo {
    const A: i32 = 4;
}

impl Foo for bool {
    const A: i32 = 5;
}
Run Code Online (Sandbox Code Playgroud)

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

通过使用dyn Foo原始类型被擦除,并且如果没有对值的指针/引用,dyn Foo则没有可以查阅的虚表。对于没有参数的特征方法也存在同样的问题self。

为此,您需要常规泛型:

trait Trait {
    const A: i32 = 64;
}

fn fun<T: Trait>(t: T) -> i32 {
    T::A
}
Run Code Online (Sandbox Code Playgroud)