gpt4 book ai didi

types - 可以使用类型关联常量将数组大小参数泛化为函数吗?

转载 作者:行者123 更新时间:2023-11-29 08:08:39 26 4
gpt4 key购买 nike

Rust 的类型系统不会对大小进行泛化,而是使用 type associated constants (Rust 1.20 中的新功能)我认为可以通过在类型上声明常量大小来实现这一点。

给定在 Rust 中对固定大小数组进行操作的函数,使用类型常量来声明采用任意数组大小或至少预定义大小范围 (1..32) 的函数是否可能/实用。

以这个小型数学 API 为例:

// Cut down example of a math API

// Could be changed at compile time, otherwise quite limiting.
pub const DIMS: usize = 3;

pub fn sq(a: f64) -> f64 { a }

pub fn len_squared_vnvn(v0: &[f64; DIMS], v1: &[f64; DIMS]) -> f64 {
let mut d = 0.0;
for j in 0..DIMS {
d += sq(v0[j] - v1[j]);
}
return d;
}

fn imul_vn_fl(v0: &mut [f64; DIMS], f: f64) {
for j in 0..DIMS {
v0[j] *= f;
}
}

能否将 DIMS 移动到类型关联常量,以便...

  • imul_vn_fl 等函数可用于任意固定大小的数组。
  • 支持传递原始固定大小数组类型,例如:[f64; SOME_CONSTANT_NUMBER] 或者,更可能的是,零成本转换为包装 [f64; #] 并定义了 DIMS 类型常量。
  • 使用 std::convert::From/Into 避免在调用时显式地编写转换。
  • 生成的代码应该与使用常量大小一样高效(无运行时大小检查)。

我正在想象这样的事情:

// this would be a macro to avoid re-writing for every size.
type f64v3 = u64;
impl VectorSize for f64v3 {
const usize DIMS = 3;
}
// end macro

fn example() {
let var: [f64; 3] = [0.0, 1.0, 2.0];
imul_vn_fl(var, 0.5);

// ...
}

最佳答案

关联常量的(当前?)限制是它们不能在泛型类型上调用。即,按照您的示例,使用关联的常量,您可以执行此操作:

trait VectorSize {
const DIMS: usize;
}

impl VectorSize for u64 {
const DIMS: usize = 3usize;
}

fn imul_vn_fl(v0: &mut [f64; u64::DIMS], f: f64) {
for j in 0..u64::DIMS {
v0[j] *= f;
}
}

但您最终希望能够使 imul_vn_fl 通用并让它使用在您的类型上定义的 DIMS。这是关联常量仍然不足的地方(请参阅 https://github.com/rust-lang/rust/issues/29646 中的第一个“缺点”)

// this does not compile, unfortunately; T must be a concrete type
fn imul_vn_fl<T>(v0: &mut [f64; T::DIMS], f: f64)
where
T:VectorSize
{
for j in 0..T::DIMS {
v0[j] *= f;
}
}

playground

关于types - 可以使用类型关联常量将数组大小参数泛化为函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com