出典
#
配列の要素数はコンパイル時に決定されているため、入力に応じて長さを伸縮できない。
下記はコンパイルエラーになる。(要素数arr_lenが変数のためコンパイルエラー)
let arr_len: usize = 8; let arr = [0 as u8; arr_len];
一方、Vecだとコンパイル時に要素数が決定されていなくても良い。
下記のようにvec!マクロで宣言すると楽。(要素数はvec_len)
let vec_array = vec![0 as u8; vec_len];
#
下記rustソースでは、
- 標準入力から文字列を受け取る。
- 文字列から数値(vec_len)に変換する。
- vec_len個の要素を持つVecを生成する(vec_array)。
- vec_arrayの要素数と全要素を表示する。
標準入力に応じてvec_arrayの要素数が変化するのが確認でき、 実行時に(入力に応じて)要素数を決定できる。
use std::io; fn main() { //文字列格納先 let mut input_str = String::new(); //標準入力から文字列を読む println!("array len:"); io::stdin() .read_line(&mut input_str) .expect("failed to read line"); //usize型に変換 let vec_len: usize = input_str.trim().parse().expect("failed to parse"); //u8型を要素に持つVec配列を生成 let vec_array = vec![0 as u8; vec_len]; //生成した配列長と、配列を表示 println!("array len={}\tarray={:?}", vec_array.len(), vec_array); }
実行例(10を入力)
array len: 10 array len=10 array=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Process finished with exit code 0
C言語で動的配列と調べるとmallocがすぐに出るが、 rustだと検索してもvec!が直球で出てこなかった気がした。(ドキュメントをちゃんと読めば書いてあると思うが)