我正在尝试开发一个包含常量和函数的数学库。我需要做什么才能将值绑定(bind)到使用泛型的特征?
我的 Rust 1.30.0 项目中的函数使用泛型作为参数,我需要常量来匹配相同类型的 T
所以我可以在函数中使用它们(这里我也是使用 num 箱子):
use num_traits as ntraits; // 0.2.6
use std::{f32, f64};
pub trait consts<T> {
const INGA: T;
}
impl<T> consts<f32> for T {
const INGA: f32 = f32::consts::FRAC_2_SQRT_PI;
}
impl<T> consts<f64> for T {
const INGA: f64 = f64::consts::FRAC_2_SQRT_PI;
}
pub struct CMPS<T> {
pub a: T,
pub b: T,
}
pub type CMPS32 = CMPS<f32>;
pub type CMPS64 = CMPS<f64>;
impl<T: Clone + ntraits::Float + ntraits::FromPrimitive> CMPS<T> {
pub fn cerf(a: T, b: T) -> CMPS<T> {
let pr: T = consts::INGA;
let rtr = a;
let rti = b;
CMPS { a: rtr, b: rti }
}
}
但是当我尝试执行此绑定(bind)时,期望 pr
与 T
的类型相同,并且与 INGA
的值相匹配:
let pr: T = consts::INGA;
它只输出如下错误:
error[E0283]: type annotations required: cannot resolve `_: consts<T>`
--> src/lib.rs:27:21
|
27 | let pr: T = consts::INGA;
| ^^^^^^^^^^^^
|
note: required by `consts::INGA`
--> src/lib.rs:5:5
|
5 | const INGA: T;
| ^^^^^^^^^^^^^^
最佳答案
我通过添加 + consts<T>
得到它在CMPS
实现和改变let pr: T = consts::INGA;
至 let pr = T::INGA
结果如下:
impl<T: Clone + ntraits::Float + ntraits::FromPrimitive + consts<T>> CMPS<T> {
pub fn cerf(a: T, b: T) -> CMPS<T> {
let pr = T::INGA;
CMPS { a: rtr, b: rti }
}
}
关于generics - 如何根据 Rust 中的泛型选择常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54133015/