2017-07-01 41 views
2

我已經構造數組的數組這樣的:傳遞數組函數:陣列必須具有「尺寸」型

let mut my_array = [[false; WIDTH]; HEIGHT]; 

其中WIDTHHEIGHT預先定義的常量。

我想將整個數組傳遞給一個函數,並更改數組中的值,但不是數組的大小/長度。

我已經試過:

array_func(&my_array); // (in main function) 

fn array_func(arr: &mut [[bool]]) { 
    println!("{:?}", arr); 
} 

而我得到的錯誤:

the trait 'std::marker::Sized' is not implemented for '[bool]' 
note: `[bool]` does not have a constant size known at compile-time 
note: slice and array elements must have `Sized` type 

我的數組的大小應該在編譯時知道 - 我不能改變的大小陣列。至少,我認爲let mut my_array意味着我可以更改數組中的值,但不是數組的大小。

回答

6
the trait 'std::marker::Sized' is not implemented for '[bool]' 

基本上有2種形式的陣列中鏽:

  • [T; N]NT秒的陣列,它是Sized
  • [T]是僅在運行時已知的大小爲T的數組,它不是Sized,並且只能真正作爲片段操作(&[T])。

你在你的代碼的問題是,在[[bool]],內[bool]因此不Sized,只有Sized元素可以被存儲在一個數組。

最簡單的解決辦法可能是更新您的函數簽名正確標註數組大小:

fn array_func(arr: &mut [[bool; WIDTH]; HEIGHT]) { 
} 

它可以強迫一個&[T; N]&[T],所以你也可以使用:

fn array_func(arr: &mut [[bool; WIDTH]]) { 
} 

然而,不可能強制[[T; N]][&[T]],因此不可能將&[[T; N]; M]強制轉換爲&[&[T]; M](因此&[&[T]]),因爲數組和數組的引用具有不同的內存表示,因此這將是O(M)操作(並且需要一個大小爲M的新數組)。

At least, I thought the let mut my_array meant I could change the values within the array but not the size of the array.

這是正確的確實,該陣列的尺寸是其類型的一部分,和mut只允許改變值不是類型。

相關問題