如何将1加到通用T?

typ*_*gic 2 rust

下面是一个通用类型Foo。如何正确实现该addOne方法:

struct Foo<T> {
    n: T,
}

impl<T> Foo<T> {
    fn addOne(self) -> T {
        self.n + 1
    }
}

fn main() {
    let a = Foo { n: 5 };
    println!("{}", a.addOne());
}
Run Code Online (Sandbox Code Playgroud)

我期望输出为6,但是此代码无法编译:

struct Foo<T> {
    n: T,
}

impl<T> Foo<T> {
    fn addOne(self) -> T {
        self.n + 1
    }
}

fn main() {
    let a = Foo { n: 5 };
    println!("{}", a.addOne());
}
Run Code Online (Sandbox Code Playgroud)

Sve*_*rev 7

您可以在num板条箱的帮助下完成此操作:

use num::One; // 0.2.0
use std::ops::Add;

struct Foo<T: Add<T>> {
    n: T,
}

impl<T> Foo<T>
where
    T: Add<Output = T> + One,
{
    fn addOne(self) -> T {
        self.n + One::one()
    }
}

fn main() {
    let a = Foo { n: 5 };
    println!("{}", a.addOne());
}
Run Code Online (Sandbox Code Playgroud)

您可以通过One练习来实现自己的目的,但是需要很多样板代码:

trait One {
    fn one() -> Self;
}

// Now do the same for the rest of the numeric types such as u8, i8, u16, i16, etc
impl One for i32 {
    fn one() -> Self {
       1
    }
}
Run Code Online (Sandbox Code Playgroud)