Generics Rust常量表达式依赖于泛型参数

Generics Rust常量表达式依赖于泛型参数,generics,rust,Generics,Rust,我试图推广Rust中的一些代数运算(如群、环、域等),我在尝试实现两个“集”(Vec)的叉积时遇到了这个问题 (请注意,这是在夜间工具链中使用const_generics) fn叉积(左:向量、右:向量)->Vec{ 释放mut:Vec=Vec::具有_容量(lhs.len()*rhs.len()); 对于0..lhs.len()中的i{ 对于0..rhs.len()中的j{ 让mut-inner[T;N+M]=[lhs[i][0];N+M]; 对于1..N中的idx{ 内[idx]=lhs[i

我试图推广Rust中的一些代数运算(如群、环、域等),我在尝试实现两个“集”(Vec)的叉积时遇到了这个问题

(请注意,这是在夜间工具链中使用
const_generics

fn叉积(左:向量、右:向量)->Vec{
释放mut:Vec=Vec::具有_容量(lhs.len()*rhs.len());
对于0..lhs.len()中的i{
对于0..rhs.len()中的j{
让mut-inner[T;N+M]=[lhs[i][0];N+M];
对于1..N中的idx{
内[idx]=lhs[i][idx];
}
对于0..M中的idx{
内部[idx+N]=rhs[j][idx];
}
向外推(内);
}
}
出来
}
无论我在哪里有表达式
[T;N+M]
,我都会得到一个错误,它说常量表达式依赖于一个泛型参数,这是没有意义的。

实际上,您的代码需要的只是两个特性标志

#![特征(const_泛型)]
#![特征(常数可评估值已检查)]
fn叉积(lhs:Vec,rhs:Vec)->Vec{
释放mut:Vec=Vec::具有_容量(lhs.len()*rhs.len());
对于0..lhs.len()中的i{
对于0..rhs.len()中的j{
让mut-inner[T;N+M]=[lhs[i][0];N+M];
对于1..N中的idx{
内[idx]=lhs[i][idx];
}
对于0..M中的idx{
内部[idx+N]=rhs[j][idx];
}
向外推(内);
}
}
出来
}
fn main(){
设a=vec![[1i32,2,3],[1,2,3],[1,2,3];
设b=vec![[1,2,3],[1,2,3],[1,2,3];
println!(“{:?}”,叉积(a,b));
}
当试图用
#编译时![feature(min_const_generics)]
,编译器实际上推荐这种解决方案:

error: generic parameters may not be used in const operations
 --> src/main.rs:2:102
  |
2 | fn CrossProduct<T: Copy, const N: usize, const M: usize>(lhs: Vec<[T;N]>, rhs: Vec<[T;M]>) -> Vec<[T;N+M]> {
  |                                                                                                      ^ cannot perform const operation using `N`
  |
  = help: const parameters may only be used as standalone arguments, i.e. `N`
  = help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions
错误:常量操作中不能使用泛型参数
-->src/main.rs:2:102
|
2 | fn叉积(lhs:Vec,rhs:Vec)->Vec{
|^无法使用'N'执行常量操作`
|
=帮助:常量参数只能用作独立参数,即`N`
=帮助:使用“#![feature(const_generics)]”和“#![feature(const_evaluable_checked)]”允许通用常量表达式

乍一看,我想这还没有实现。Const泛型还远远没有完成。您可能想在rust lang/rust上搜索GitHub问题,以查看这样的表达式的状态。请注意,这两个功能仍然不完整,因此即使您可以使用它们,它们也可能带来编译器错误,而c由于您的程序行为不当(正如编译器警告的那样)。您绝对不应该在任何生产代码中使用这些功能。
error: generic parameters may not be used in const operations
 --> src/main.rs:2:102
  |
2 | fn CrossProduct<T: Copy, const N: usize, const M: usize>(lhs: Vec<[T;N]>, rhs: Vec<[T;M]>) -> Vec<[T;N+M]> {
  |                                                                                                      ^ cannot perform const operation using `N`
  |
  = help: const parameters may only be used as standalone arguments, i.e. `N`
  = help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions