如何实现以下功能,其中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
}
答案 0 :(得分:2)
问题在于泛型是在之前进行类型检查以进行扩展;这意味着编译器必须验证n as T
(n
是i32
)对所有可能的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
。
如果你想要实现所述特征的类型不止一种,那么一个简单的宏应该减少重复。