雑感等

音楽,数学,語学,その他に関するメモを記す.

Rustで配列(Vec)の要素数を変数で指定:vec!マクロ

出典

https://users.rust-lang.org/t/attempt-to-use-a-non-constant-value-in-a-constant/32112#:~:text=Sep%20%2719-,Use%20vec!%5BDefault%3A%3Adefault()%3B%20n%5D%20or%20Vec%3A%3Awith_capacity(n)%20and%20push%20to%20it.,-Solution

#

配列の要素数コンパイル時に決定されているため、入力に応じて長さを伸縮できない。

下記はコンパイルエラーになる。(要素数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!が直球で出てこなかった気がした。(ドキュメントをちゃんと読めば書いてあると思うが)