rust - 为什么只能用特征指定类型限制?

标签 rust language-design

在 Rust 中你只能使用 traits 来指定类型限制,例如:<T: A + B> , A 和 B 必须是特征,它们不能是像 i32 这样的原始类型或 f64 .

trait Foo {}

impl Foo for i32 {}

fn blah<T: i32>(val: T) {
    //     ^^^ works if this is Foo
    println!("hello\n");
}

fn main() {
    let toast: i32 = 33;
    blah(toast);
}

您可以通过原语实现特征来解决这个问题,但是为什么语言的设计者不允许您使用原语作为限制?

最佳答案

因为用类型指定类型限制没有意义。


使用泛型编程的真正原因是允许多个具体类型。这就是为什么要表达边界,并且可以使用满足这些边界的任何类型。

如果您希望使用具体类型,您当然可以……但不能使用泛型函数;您只需使用常规函数即可。


请注意,边界是加法,也就是说,当指定 T: X + Y 时,您并不是说任何实现 X 或 Y 的类型都是预期的,但是您想要一个同时实现 X 和 Y 的类型。这里的 + 是一个交集

结果:

  • T: i32没用,指定i32为类型即可
  • T: i32 + f32 是无意义的,没有类型既是 i32 又是 f32 在同一类型

那么……如何指定OR关系呢?通过使用特征!

trait MyTrait: std::fmt::Display {}

impl MyTrait for i32 {}
impl MyTrait for f32 {}

fn hello<T: MyTrait>(t: &T) {
    println!("{:?}", t);
}

注意:如果您的特征是公开的,其他人可能会为他们自己的类型实现您的特征。

关于rust - 为什么只能用特征指定类型限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413615/

相关文章:

c# - 清净属性(property)申报

rust - 在调用异步 fns 时创建值流?

c# - C#有太多的语言功能吗?

c# - 为什么 C++ 允许实际上不返回值的函数?

rust - 在 Rust 中使用 return 语句和省略分号有什么区别?

c# - 为什么局部变量需要初始化,而字段不需要?

c++ - 为什么变量名不能以数字开头?

vector - 为什么 Vec.sort() 似乎需要静态生命周期?

assembly - 尝试通过 int 16h 读取 key 以 VM 重启结束

assembly - 为什么 rust 在有和没有 pub 和 #[no_mangle] 的情况下会产生完全不同的 assembly ?