【发布时间】: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
如何实现如下函数,其中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
问题是泛型在扩展之前进行了类型检查;这意味着编译器必须验证n as T(其中n 是i32)对于所有可能的T 都有效。不是。
您想要是使用 trait 将 T 约束为可以从 i32 转换的类型。有点可悲的是,这种特质并不存在。
最接近的模拟可能是std::convert::From,但它没有实现这样的基本转换,您自己也无法提供它们。曾经有一些特征可以处理与原始整数类型之间的转换,但我相信它们在 1.0 清理之前已被删除。
此时,您基本上是靠自己了。您需要滚动一个表达这种转换的特征,然后为您关心的类型实现它。因此,您可以使用以下特征:
trait FromI32 {
fn from_i32(v: i32) -> Self;
}
然后将函数更改为使用<T: FromI32> 和FromI32::from_i32(n) 而不是n as T。
如果您想要实现上述特征的类型不止几种,那么一个简单的宏应该可以减少重复。
【讨论】: