Types 如何统一使用f64和Complex的函数<;f64>;?

Types 如何统一使用f64和Complex的函数<;f64>;?,types,rust,Types,Rust,我有两个职能: fn f1(k1:f64,k2:f64,k3:f64)->(f64,f64){ 设a=k1+k2; 设b=k2*k3.sqrt(); (a+b,a-b) } type Z64=num::complex::complex; fn f2(k1:Z64,k2:Z64,k3:Z64)->(Z64,Z64){ 设a=k1+k2; 设b=k2*k3.sqrt(); (a+b,a-b) } 代码相同,只是类型不同。一个是f64。另一个是复杂的。这两种类型上都可能有一个多态函数吗?因为std

我有两个职能:

fn f1(k1:f64,k2:f64,k3:f64)->(f64,f64){
设a=k1+k2;
设b=k2*k3.sqrt();
(a+b,a-b)
}
type Z64=num::complex::complex;
fn f2(k1:Z64,k2:Z64,k3:Z64)->(Z64,Z64){
设a=k1+k2;
设b=k2*k3.sqrt();
(a+b,a-b)
}

代码相同,只是类型不同。一个是
f64
。另一个是复杂的。这两种类型上都可能有一个多态函数吗?

因为std中没有
sqrt
的特征,而且
Complex
没有实现
num\u traits::Float
,所以您必须为它创建自己的特征

trait Sqrt {
    fn sqrt(self) -> Self;
}

impl Sqrt for f64 {
    fn sqrt(self) -> Self {
        f64::sqrt(self)
    }
}

impl Sqrt for Z64 {
    fn sqrt(self) -> Self {
        Z64::sqrt(&self)
    }
}
然后,你可以简单地要求所需的特征

use std::ops::{Add, Mul, Sub};

fn calc<T>(k1: T, k2: T, k3: T) -> (T, T)
where
    T: Add<Output = T> + Mul<Output = T> + Sub<Output = T> + Sqrt + Copy
{
    let a = k1 + k2;
    let b = k2 * k3.sqrt();
    (a + b, a - b)
}
使用std::ops:{Add,Mul,Sub};
fn计算(k1:T,k2:T,k3:T)->(T,T)
哪里
T:Add+Mul+Sub+Sqrt+Copy
{
设a=k1+k2;
设b=k2*k3.sqrt();
(a+b,a-b)
}

如果您在许多地方使用相同的边界,.

谢谢。真不幸。我选择了宏。