2016-08-14 53 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中都有語言級別的進展,以及圍繞完整常量相關類型的持續討論。因此,我希望在不久的將來不要使用通用數組箱子。

相關問題