web-dev-qa-db-ja.com

Rust構造体の変数を初期化するより速い/短い方法はありますか

次の例では、フィールドの宣言の構造体の各フィールドに値を割り当てることをお勧めします。または、フィールドに値を割り当てるために、フィールドごとに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,
        }
    }
}
73
Brian Oh

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を使用しているようです。 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() };
_
118
Zargony