【问题标题】:How can I implement a function that returns a generic constrained by an integral type?如何实现一个返回受整数类型约束的泛型的函数?
【发布时间】:2015-05-01 21:02:56
【问题描述】:

如何实现如下函数,其中T 是整数类型?

fn get_vec<T>() -> Vec<T>
{
    let vec: Vec<T> = Vec::new();
    let n: i32 = 5;
    let n_as_t = n as T;
    vec.push(n_as_t);
    vec
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    问题是泛型在扩展之前进行了类型检查;这意味着编译器必须验证n as T(其中ni32)对于所有可能的T 都有效。不是。

    想要是使用 trait 将 T 约束为可以从 i32 转换的类型。有点可悲的是,这种特质并不存在。

    最接近的模拟可能是std::convert::From,但它没有实现这样的基本转换,您自己也无法提供它们。曾经有一些特征可以处理与原始整数类型之间的转换,但我相信它们在 1.0 清理之前已被删除。

    此时,您基本上是靠自己了。您需要滚动一个表达这种转换的特征,然后为您关心的类型实现它。因此,您可以使用以下特征:

    trait FromI32 {
        fn from_i32(v: i32) -> Self;
    }
    

    然后将函数更改为使用&lt;T: FromI32&gt;FromI32::from_i32(n) 而不是n as T

    如果您想要实现上述特征的类型不止几种,那么一个简单的宏应该可以减少重复。

    【讨论】:

    • 谢谢,这正是我所需要的。如果可以的话,我会代表你:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多