如何在 Rust 中对 `{integer}` 类型实现一个 trait

4

有没有一种方法可以为 {integer} 类型(或所有整数类型)实现一个 trait。因为(作为最简单的示例):

pub trait X {
    fn y();
}

impl<T> X for T {
    fn y() {
        println!("called");
    }
}

fn main() {
    (32).y();
}

出现错误:

error[E0689]: can't call method `y` on ambiguous numeric type `{integer}`
  --> src/main.rs:12:10
   |
12 |     (32).y();
   |          ^
   |
help: you must specify a concrete type for this numeric value, like `i32`
   |
12 |     (32_i32).y();
   |      ~~~~~~

For more information about this error, try `rustc --explain E0689`.

有没有一种方法可以为任何整数类型实现trait X,以便它可以在任何整数上使用(甚至是模糊的{integer}类型)?因为如果对所有整数类型进行实现,则其实现都相同,那么为什么要关心确切的类型呢?

3
不,"{integer}"在Rust中是深度魔法和特殊情况。它不是实际的类型,只是在类型推断中用作中间变量。 - Silvio Mayolo
1
num_traits 可以帮助将许多数值类型视为一个整体。 - prog-fh
1
因为编译器无法确定它们是否相同,所以如果所有整数类型的实现都相同,为什么要关心确切的类型? - Chayim Friedman
1个回答

4

可以通过以下方式将类型T绑定到num_traits::PrimInt

use num_traits::PrimInt;

trait Trait {
    fn y(self) -> Self;
}

impl<T: PrimInt> Trait for T {
    fn y(self) -> Self {
        println!("called");
        return self;
    }
}

fn main() {
    let x = 32;
    println!("{}", x.y());
}

我可以使用 num_traits::Float 来处理 {float} 类型吗? - MarcellPerger
1
@MarcellPerger,是的。 - user1635327

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接