[解決済み] 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,
}
}
}
解決方法は?
を実装することで、構造体にデフォルト値を提供することができます。
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() };
関連
-
[解決済み] RustのRc::clone(&rc)とrc.clone()は何か違いがあるのでしょうか?また、それによるコンパイルの最適化はあるのでしょうか?
-
[解決済み] 構造体や配列を印刷するには?
-
[解決済み] Rustのユニットテストでprintln! が動作しないのはなぜ?
-
[解決済み】文字列をint型に変換する?
-
[解決済み】ある値とその値への参照を同じ構造体に格納できないのはなぜですか?
-
[解決済み】Rustの実行ファイルはなぜこんなに巨大なのですか?
-
[解決済み】Rust 1.xでファイルを読み書きするデファクトの方法は?
-
[解決済み】RustプログラムがCargoパッケージからメタデータにアクセスする方法は?
-
[解決済み] カスタムステップで範囲を反復処理するには?
-
[解決済み] アポストロフィが1つ付いているラストタイプは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 構造体や配列を印刷するには?
-
[解決済み] 文字列を追加して印刷するにはどうすればよいですか?
-
[解決済み] Rustのユニットテストでprintln! が動作しないのはなぜ?
-
[解決済み】Rustで文字列を分割する方法は?
-
[解決済み】RustプログラムがCargoパッケージからメタデータにアクセスする方法は?
-
[解決済み] このクエスチョンマークの演算子は何についてですか?
-
[解決済み] Iterator(またはその他の trait)を返す正しい方法は何ですか?
-
[解決済み] クロージャがFn、FnMut、FnOnceを実装するのはどんなとき?
-
[解決済み] ローカルの未公開クレートを使うには?
-
[解決済み] カスタムステップで範囲を反復処理するには?