次の例では、フィールドの宣言の構造体の各フィールドに値を割り当てることをお勧めします。または、フィールドに値を割り当てるために、フィールドごとに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を使用しているようです。 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() };
_