2013-10-29 63 views
46

次の例では、フィールドの宣言で構造体の各フィールドに値を代入する方が好きです。あるいは、フィールドに値を割り当てるために、フィールドごとに1つの追加ステートメントを効果的に取ります。私ができるようにしたいのは、構造体がインスタンス化されたときにデフォルト値を割り当てることだけです。Rust構造体の変数を初期化する高速/短期の方法はありますか?

もっと簡潔な方法がありますか?

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

あなたはDefault形質を実装することによって、あなたの構造体のデフォルト値を提供することができます。 、あなたのデータ構造にはいくつかのマイナーな変更により

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

あなたを:あなたはその後、唯一の非デフォルト値を与えることによって、構造体のインスタンスを作成することができます

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

default機能は、現在のnew機能のようになります。自動的に導出されたデフォルト実装を利用することができます。データ構造体に#[derive(Default)]を使用すると、コンパイラはデフォルト値で各フィールドを塗りつぶすデフォルト関数を自動的に作成します。デフォルトのブール値はfalseです。デフォルトの整数値は0です。

整数フィールドのデフォルト値は-1であるため、整数のデフォルト値は0です。既定値-1を実装する新しい型を定義し、構造体にi64の代わりにその型を使用できます。 (私はそれをテストしていませんが、うまくいくはずです)。

しかし、データ構造を少し変更し、i64ではなくOption<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() }; 
+1

おかげで、私は、迅速な読み取りがあったが、私はより良い理解するために再読みます。いくつかの言語が使用する "自然な"デフォルトは、私がゼロ、偽、 ""などと信じているように私に合っています。解決すべき私の小さな「問題」よりも広い意味があることを理解しています。例えば、 "iVal:i64 = 0"、私のより広いニーズを解決するだろうが、それは起こることはないと思う。 "#[deriving(Default)]"​​は私の望みのほとんどを解決するはずです。なぜ私はテストプログラムで-1を使用したのか分かりませんが、それは必要ありません(歴史的)。フィールドが定義されているインサイチュで値を割り当てることができるのは非常に便利です(IMHO)。 –

+4

@BrianOh、接頭辞として、 "構造体フィールドのデフォルト値"(つまり 'struct Foo {val:i64 = 0}'のようなもの)が提案されています。 – huon

+0

それがIMOの実装されていれば良いでしょう - "struct foo {...."私は、私の質問と既定値で書かれた構造体を使用して、あなたの提案に変更を加えました。それは確かに私に良く合い、はるかに簡潔です。構文に慣れていないので、私が持っていた小さな問題の1つは、すべてのデフォルトの構文を知らないことでした。 IE: "= cParams {iInsertMax:10、.. Default :: default()};"を使用しましたが、実際には "iInstanceMax"をデフォルトにします。 IMOの場合、#[deriving(Default)]が構造体の一部であることが望ましいでしょうが、コンパイラの方が良いと思います。 –

関連する問題