如何实现一个返回由整数类型约束的泛型的函数?

时间:2015-05-01 12:03:06

标签: rust

如何实现以下功能,其中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
}

1 个答案:

答案 0 :(得分:2)

问题在于泛型是在之前进行类型检查以进行扩展;这意味着编译器必须验证n as Tni32)对所有可能的T是否有效。事实并非如此。

您想要的是使用特征将T约束为可以从i32投射的类型。有点悲惨的是,这种特质不存在。

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

在这一点上,你基本上是靠自己。您需要滚动表示此转换的特征,然后针对您关注的类型实现它。因此,您可以使用以下特征:

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

然后将功能更改为使用<T: FromI32>FromI32::from_i32(n)而不是n as T

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