2016-08-14 52 views
5

对数组进行操作,例如对长度进行平方。如何使用通用定长数组定义函数?

这是非常有用的泛型类型(如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

是否可以定义泛型函数在该尺寸不是动态的,但通用的,以同样的方式类型可以通用?

+1

另请参见[是否可以使用泛型的类型参数控制成员数组的大小](http://stackoverflow.com/q/28136739/155423)以及所有链接的重复项。 – Shepmaster

回答

7

没有,目前的锈1.14是不可能的。这(通常称为“类型级别整数”)是一个长期要求的功能,但它在Rust中尚不可用。

已经有一些RFC;最近的一次令人惊讶并且相当有希望:RFC: const-dependent type system。但即使它被接受,它也需要多个Rust版本才能最终着陆(例如,它很可能会在2016年仍然不会成为稳定的编译器)。

有几个模拟类型级整数的箱子,比如type-num。这是有用的,但我不会说它是一个完整的选择。

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

1

首先,有许多类型级数字感觉很诱人的API,但是您可以通过更直接地使用关联类型来提高灵活性。

这就是说..

有一个generic-array crate,几乎可以做到这一点,现在,使用上述类型NUM,但它变得有点凌乱,但应该做你想要的这里。尽管我自己避而远之。

rfcscompiler中都有语言级别的进展,以及围绕完整常量相关类型的持续讨论。因此,我希望在不久的将来不要使用通用数组箱子。

相关问题