1. ホーム
  2. rust

[解決済み] Rust構造体の変数を初期化する、より速い/より短い方法はありますか?

2022-05-10 15:19:06

質問

次の例では、フィールドの宣言で構造体の各フィールドに値を割り当てる方がはるかに好ましいと思います。また、フィールドに値を割り当てるには、各フィールドに 1 つのステートメントを追加する必要があります。私が望むのは、構造体をインスタンス化するときにデフォルト値を割り当てることだけです。

もっと簡潔な方法はないでしょうか?

struct cParams {
    iInsertMax: i64,
    iUpdateMax: i64,
    iDeleteMax: i64,
    iInstanceMax: i64,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

impl cParams {
    fn new() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

解決方法は?

を実装することで、構造体にデフォルト値を提供することができます。 Default という形容があります。この default 関数は、現在の new 関数を使用します。

impl Default for cParams {
    fn default() -> cParams {
        cParams {
            iInsertMax: -1,
            iUpdateMax: -1,
            iDeleteMax: -1,
            iInstanceMax: -1,
            tFirstInstance: false,
            tCreateTables: false,
            tContinue: false,
        }
    }
}

そして、デフォルト以外の値だけを与えて、構造体をインスタンス化することができます。

let p = cParams { iInsertMax: 10, ..Default::default() };

データ構造を少し変更するだけで、自動的に派生するデフォルトの実装を利用することができます。もしあなたが #[derive(Default)] のデータ構造では、コンパイラが自動的にデフォルト関数を作成し、各フィールドをデフォルト値で埋めてくれます。ブール値のデフォルトはfalseで、積分値のデフォルトは0である。

整数のフィールドはデフォルトで-1にしたいので、整数のデフォルト値が0であることはここでは問題です。デフォルト値として -1 を実装した新しい型を定義して、それを i64 を構造体の中に入れてください。(テストしていませんが、うまくいくはずです)。

ただし、データ構造を少し変えて Option<i64> の代わりに i64 . あなたのコードの文脈はわかりませんが、特別な値である-1を使って、"infinite"、つまり"there's no max"という特別な意味を表しているように見えます。Rust では Option は、オプションで存在する値を表します。1のハックは必要ない。オプションは以下のいずれかになります。 None または Some(x) ここで、x はあなたの i64 ここで 負の値が-1だけなら、符号なし整数でもよいでしょう。デフォルトの Option の値は None ということで、今回の変更案では、以下のようなコードになります。

#[derive(Default)]
struct cParams {
    iInsertMax: Option<u64>,
    iUpdateMax: Option<u64>,
    iDeleteMax: Option<u64>,
    iInstanceMax: Option<u64>,
    tFirstInstance: bool,
    tCreateTables: bool,
    tContinue: bool,
}

let p = cParams { iInsertMax: Some(10), ..Default::default() };