次の例では、フィールドの宣言で構造体の各フィールドに値を代入する方がはるかに好ましいと思います。または、フィールドに値を割り当てるために、各フィールドに 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
の代わりにそれを使用することができます。(テストはしていませんが、うまくいくはずです)。
しかし、データ構造を少し変えて、i64
の代わりに Option<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() };