如何实现 returns 泛型受整数类型约束的函数?
How can I implement a function that returns a generic constrained by an integral type?
如何实现如下函数,其中 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
}
问题是泛型在扩展之前进行了类型检查;这意味着编译器必须验证 n as T
(其中 n
是一个 i32
)对于所有可能的 T
都有效。不是。
您想要的是使用特征将T
限制为可以从i32
转换的类型。有点可悲的是,这种特质并不存在。
最接近的模拟可能是 std::convert::From
,但它没有实现此类基本转换,您不能自己提供它们。曾经有一些处理转换 to/from 原始整数类型的特征,但我相信它们在 1.0 清理之前被删除了。
在这一点上,你基本上是靠自己了。您需要滚动表示此转换的特征,然后为您关心的类型实现它。因此,您可以使用如下特征:
trait FromI32 {
fn from_i32(v: i32) -> Self;
}
然后将函数更改为使用 <T: FromI32>
和 FromI32::from_i32(n)
而不是 n as T
。
如果要实现所述特征的类型不止几种,一个简单的宏应该可以减少重复。
如何实现如下函数,其中 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
}
问题是泛型在扩展之前进行了类型检查;这意味着编译器必须验证 n as T
(其中 n
是一个 i32
)对于所有可能的 T
都有效。不是。
您想要的是使用特征将T
限制为可以从i32
转换的类型。有点可悲的是,这种特质并不存在。
最接近的模拟可能是 std::convert::From
,但它没有实现此类基本转换,您不能自己提供它们。曾经有一些处理转换 to/from 原始整数类型的特征,但我相信它们在 1.0 清理之前被删除了。
在这一点上,你基本上是靠自己了。您需要滚动表示此转换的特征,然后为您关心的类型实现它。因此,您可以使用如下特征:
trait FromI32 {
fn from_i32(v: i32) -> Self;
}
然后将函数更改为使用 <T: FromI32>
和 FromI32::from_i32(n)
而不是 n as T
。
如果要实现所述特征的类型不止几种,一个简单的宏应该可以减少重复。