generics - 如何根据 Rust 中的泛型选择常量?
问题描述
我正在尝试使用具有常量和函数的数学库。我需要做什么才能将值绑定到使用泛型的特征?
我的 Rust 1.30.0 项目中的函数使用泛型作为参数,我需要常量匹配相同的类型,T
以便我可以在函数中使用它们(这里我也使用 num crate):
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 }
}
}
但是当我尝试执行此绑定时,期望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 }
}
}
推荐阅读
- c - 打印具有自定义行、列和长度的重复菱形
- html - HTML CSS 相同的表格不对齐
- javascript - 科尔多瓦ios中的谷歌地图加载问题
- c# - 控制台应用程序崩溃
- javascript - 如何通过输入一个密码访问 5 公里范围内的一组密码
- javascript - node-pre-gyp install --fallback-to-build
- intellij-idea - IntelliJ IDEA 多种终端
- java - 使用 Ant 打印 Java 的包层次结构
- internet-explorer-11 - 仅在 IE 中:表单内的组合树不起作用
- java - 在tablayout之间切换时如何修复google登录选项功能重复和崩溃