gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:22:51 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com