下面是一个通用类型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)
您可以在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)