チュートリアルからさびを学ぼうとしています。コンウェイのライフゲームから始めるのがいいと思いました。
このGrid :: new()fnの書き方を理解するのに苦労しています。
これが私がこれまでに持っているものです:
enum Cell {
alive, dead
}
impl Cell {
fn new() -> Cell {
alive
}
struct Grid {
priv inner: [ [Cell, .. GRID_SIZE], .. GRID_SIZE],
}
impl Grid {
fn new() {
Grid { inner: ???? }
}
}
..。
fn main () {
let grid = Grid::new(); // Stack allocated grid (internal stack allocad array)
}
私が欲しいのは、グリッドがすべての値「生きている」セルで初期化されることです。
Grid::new
Grid::inner
ネストされた固定サイズの配列リテラルで初期化する必要があります。これは型と同じように記述されますが、Cell
型の代わりに配列を初期化する値を使用します。
impl Grid {
fn new -> Grid {
Grid { inner: [[alive, ..GRID_SIZE], ..GRID_SIZE] }
}
}
(コンストラクター関数を使用する場合Cell::new()
はalive
、代わりに使用できます。)
このinner
メンバーは、次のように式で使用できます(priv
現在のモジュール外のコードの可視性のみを制御することに注意してください)。
let grid = Grid::new();
let nested_fixed_sized_array: [[Cell, ..GRID_SIZE], ..GRID_SIZE] = grid.inner;
let fixed_sized_array: [Cell, ..GRID_SIZE] = grid.inner[0];
let cell_element: Cell = grid.inner[0][0];
Rustでは、この例で使用されているネストされた配列は、固定サイズの配列の特殊なケースです。これがどのように機能するかを確認するには、ベクトルと文字列のチュートリアルセクションを参照してください。特に、~[T]
ヒープに動的に割り当てられ、長さを変更できる(可変の場合)ベクトル(タイプ)とは異なり、固定サイズの配列の長さはタイプ([T, ..LENGTH]
)に埋め込まれているため、変更できません。作成後にサイズを変更します。T
それ自体は、固定サイズの型またはポインターのいずれかである必要があります。ただし、代わりに、固定サイズの配列は、スタックに直接割り当てたり、struct
定義(などGrid
)に埋め込んだりできる値型です。
固定サイズ配列はそれ自体が固定サイズ型であるため、ネストされた固定サイズ配列は、固定サイズ配列が固定サイズ配列の要素型である特殊なケースにすぎません。特に、によって消費されるメモリGrid::inner
は正確ですGRID_SIZE * GRID_SIZE * sizeof(Cell)
(アライメントを無視した場合)。また~[T, ..LENGTH]
、行列の列数はわかっているが行数はわかっていない場合は、固定サイズの配列のベクトルも役立ちます。
引数がスライス(type &[T]
)の場合、ベクトルと固定サイズの配列の両方を関数引数として使用できます。
一部の詳細は、現在からRust1.0のリリースまでに変更される可能性があります。興味がある場合は、Rust subredditで「動的サイズのタイプ」を検索すると、提案された変更とその背後にある理由が明らかになるはずです。または、Redditまたは#rustIRCチャネルでいつでも質問できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加