我想编写一个add
函数,可以将这两个参数作为i64
输入。f64
我得出了以下结论:
use std::ops::Add;
fn add<T: Add<Output = T>>(a: T, b: T) -> T{
a + b
}
fn main() {
let a: i64 = 10;
let b: i64 = 20;
let c: f64 = 10.5;
let d: f64 = 20.5;
println!("{:?}", add(a, b)); // Outputs: 30
println!("{:?}", add(c, d)); // Outputs: 31.0
}
是否可以修改此功能以便可以实现:
- 一个参数是
i64
- 另一个参数是
f64
如果任一参数是,f64
我们进行强制转换并返回f64
。
类型a |
类型b |
返回type |
---|---|---|
i64 |
i64 |
i64 |
i64 |
f64 |
f64 |
f64 |
i64 |
f64 |
f64 |
f64 |
f64 |
主要函数将有以下输出:
fn main() {
let a: i64 = 10;
let b: i64 = 20;
let c: f64 = 10.5;
let d: f64 = 20.5;
println!("{:?}", add(a, b)); // Outputs: 30 | i64 + i64 -> i64
println!("{:?}", add(a, c)); // Outputs: 20.5 | i64 + f64 -> f64
println!("{:?}", add(c, a)); // Outputs: 20.5 | f64 + i64 -> f64
println!("{:?}", add(c, d)); // Outputs: 30.0 | f64 + f64 -> f64
}
您可以使用特征来实现这一点。该特征可以与内置
Add
特征相同,但由于孤儿规则,您不能使用该Add
特征本身。以下是一个示例实现:操场
孤儿规则阻止您在外部类型上实现外部特征。上面的代码通过使用自定义特征解决了这个问题。或者,您可以使用自定义类型,即围绕
i64
和的newtype 包装器f64
。由于实现与内置的加法实现相匹配,因此将两种类型中的一种包装在 newtype 包装器中就足够了。