Rust 现在支持 const 泛型。我留下了旧的答案,以便人们知道为什么有人会首先问这个问题。
自 Rust 1.51 以来的新答案:
pub trait Length {
const LEN: usize;
}
impl<T, const LENGTH: usize> Length for [T; LENGTH] {
const LEN: usize = LENGTH;
}
旧答案:
我知道您想仅从类型信息中检索数组长度。 Rust 没有内置的 PI 类型(又名:常量泛型)。这意味着通用参数是not该语言当前不支持类型(例如数组长度的整数)。
有跟踪此问题的问题我们很可能在未来看到对它的支持,尽管不是在不久的将来。
如果必须的话,您可以通过为每种类型实现一个特征来解决该限制:
trait GetLength {
fn len() -> usize;
}
impl<T> GetLength for [T; 0] {
fn len() -> usize {
0
}
}
impl<T> GetLength for [T; 1] {
fn len() -> usize {
1
}
}
// ...
fn main() {
println!("{}", <[String; 1]>::len());
}
宏可以帮助防止重复输入:
trait GetLength {
fn len() -> usize;
}
macro_rules! impl_get_length {
($v:expr) => {
impl<T> GetLength for [T; $v] {
fn len() -> usize {
$v
}
}
};
}
impl_get_length!{ 0 }
impl_get_length!{ 1 }
// ...
fn main() {
println!("{}", <[String; 1]>::len());
}
板条箱喜欢typenum还有助于为现有语言中的 const 泛型提供一些支持。