generics - 如何根据 Rust 中的泛型选择常量?

标签 generics rust constants

我正在尝试开发一个包含常量和函数的数学库。我需要做什么才能将值绑定(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)时,期望 prT 的类型相同,并且与 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/

相关文章:

java - Java 的包装工厂

arrays - 创建具有可变数量元素的数组变量

具有延迟初始化的 C++ const getter 方法

gtk - 如何从回调闭包中使用按钮本身?

c - 如何使用 inotify-rs 生成的 WatchDescriptor 结构将事件与生成它们的文件匹配?

ruby - 对 ruby​​ CONSTANT 的困惑

C# 泛型函数

c# - 我怎么知道属性是否是通用集合

java - 我可以定义 Map<String, List< 吗?扩展 BaseView>> 以便我可以从 map 中 get() 列表而无需未经检查的转换?

rust - 在这种情况下如何决定生命周期注解?