2017-01-06 9 views
3

デフォルトの構造体を作成するには、私は錆の中でfn new() -> Selfを見たことがありましたが、今日はDefaultを発見しました。だから、デフォルトの構造体を作成する2つの方法があります。デフォルトの構造体を作成するのに慣用的な方法

struct Point { 
    x: i32, 
    y: i32, 
} 

impl Point { 
    fn new() -> Self { 
     Point { 
      x: 0, 
      y: 0, 
     } 
    } 
} 

impl Default for Point { 
    fn default() -> Self { 
     Point { 
      x: 0, 
      y: 0, 
     } 
    } 
} 

fn main() { 
    let _p1 = Point::new(); 
    let _p2: Point = Default::default(); 
} 

はそうするより良い/最も慣用的な方法は何ですか?

答えて

7

あなたは、1つを選択するを持っていた場合、Default形質を実装するnew方法は、直接あなたのコードを使用しようとしている人が求めているだろうか、おそらくある間、あなたのタイプは、より多くの場所で一般的に使用できるようにするためのより良い選択肢であります。

しかし、あなたの質問は、間違った二分法です。の両方をとすることができます。そうすることをお勧めします。もちろん、自分自身を繰り返すことは愚かであるので、私は(それがないではない、本当に問題でどの方法)一方を他方から呼びたい:私はメンバーのデータ構造を持つ構造体でDefault::default()を使用

impl Point { 
    fn new() -> Self { 
     Default::default() 
    } 
} 

Clippy even has a lint for this exact case!

私は実装を変更するかもしれません。たとえば、現在HashMapを使用していて、BTreeMapに切り替えることができます。 Default::defaultを使用すると、変更する場所が1つ少なくなります。この特定のケースで


、あなたも、それは非常に簡潔作り、Defaultを導き出すことができます。

#[derive(Default)] 
struct Point { 
    x: i32, 
    y: i32, 
} 

impl Point { 
    fn new() -> Self { 
     Default::default() 
    } 
} 

fn main() { 
    let _p1 = Point::new(); 
    let _p2: Point = Default::default(); 
} 

Clippy has a lint for this too!

+4

私はちょうど "のためにかなり一般的なパターンがあることを指摘したいと思いますコンフィギュレーション "構造体は のようになります' let config = MyConfig {option1:2、option2:なし、..デフォルト:: default()} ' –

+3

@WesleyWiser yep!あなたは 'Default :: default()'に制限されていませんが、 'MyStruct :: new()'や既存の変数さえできます。 – Shepmaster

関連する問題