【问题标题】:How to define a function with a generic fixed-length array? [duplicate]如何定义具有通用固定长度数组的函数? [复制]
【发布时间】:2016-08-14 09:49:06
【问题描述】:

对数组进行操作,例如对长度进行平方。

拥有泛型类型(例如f32f64)很有用,但您可能还需要泛型长度,但不是动态长度。

这是一个接受 2 个参数的平方函数示例。

use std::ops::{Add, AddAssign, Sub, Mul};

const CAN_THIS_BE_GENERIC: usize = 2;

fn squared_length<T>(
    a: &[T; CAN_THIS_BE_GENERIC],
    b: &[T; CAN_THIS_BE_GENERIC]
) -> T
    where T:
        Copy +
        Add +
        AddAssign +
        Add<Output=T> +
        Sub<Output=T> +
        Mul<Output=T>
{
    let mut d: T = a[0] - a[0];  // zero :(
    for (elem_a, elem_b) in a.iter().zip(b.iter()) {
        let elem_dim: T = *elem_a - *elem_b;
        d += elem_dim * elem_dim;
    }
    return d;
}

fn main() {
    println!("Length A! {}", squared_length::<f64>(&[0.5, 3.5], &[10.0, 0.0]));
    println!("Length B! {}", squared_length::<i32>(&[10, -6], &[4, 8]));
    println!("Length C! {}", squared_length::<f32>(&[-3.0, 0.0], &[9.0, 0.0]));
}

目前向量长度设置为2。

是否可以定义大小不是动态的通用函数,而是通用的,就像类型可以是通用的一样?

【问题讨论】:

标签: generics rust


【解决方案1】:

,从 Rust 1.25 开始是不可能的。 (2018 年 5 月)。这(通常称为“类型级整数”)是一个长期要求的功能,但它在 Rust 中尚不可用。

已经有几个关于这个主题的 RFC。最近,终于被录取了:RFC 2000 -- Const Generics。但是,它还没有实现(tracking issue)。我预计最早会在 2018 年底实施,但更有可能是 2019 年。

有一些 crate 可以模拟类型级别的整数,例如 type-num。它有点可用,但我不会称它为完整的替代品。

还请注意:有时确实没有必要使用类型级别的整数。您的示例也适用于动态尺寸。甚至更好:因为你的函数太小了,它很可能被内联,然后优化器可能会在编译时计算出所有大小。因此,如果性能是使用类型级别整数的唯一原因,则可能没有必要。

【讨论】:

    【解决方案2】:

    首先,对于许多 API,类型级别的数字很有吸引力,但您可以通过更直接地使用关联类型来提高灵活性。

    那是..

    现在有一个generic-array crate 几乎可以做到这一点,使用前面提到的type-num,但它有点乱,但应该在这里做你想做的事。我自己虽然避免。

    rfcscompiler 都在语言层面上取得了进展,以及围绕完全依赖于 const 的类型的持续讨论。因此,我有点希望在不久的将来不推荐使用 generic-array crate。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2011-05-30
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多