2017-12-13 4 views
0

タプル構造Aまたはenum Bを初期化するには、コンストラクタをクロージャパラメータとしてwrap関数に渡すことができます。構造体をクロージャを使用して初期化する

これはフィールドx指名した構造体D、動作しません:

fn wrap<A, B, F>(item: A, f: F) -> B 
where 
    F: Fn(A) -> B, 
{ 
    f(item) 
} 

#[derive(Debug)] 
struct A<T>(T); 

#[derive(Debug)] 
enum B<T> { 
    C(T), 
} 

#[derive(Debug)] 
struct D<T> { 
    x: T, 
} 

fn main() { 
    println!("{:?}", wrap(1, A)); // prints A(1) 
    println!("{:?}", wrap(1, B::C)); // prints C(1) 
    // println!("{:?}", wrap(1, D)); // sounds good, doesn’t work 
} 

playground

それは何とかそれが名前のフィールドを持つ構造体のために動作させることは可能ですか?

答えて

3

'名前付きフィールドのない構造体'は構造体ではなくタプル構造体です。タプル構造体の名前は関数名と同じように使用できますが、構造体名には当てはまりません。

println!("{:?}", wrap(1, |i|(D { x: i }))); // doesn't sound good, but works 
+4

でも短い:1つの構造体をインスタンス化するために構造体名を使用して、パラメータの名前を指定する必要があります 'ラップ(1、| X | D {X})のような名前のデータと' –

+0

どうやら列挙型のバリアントこの 'enum A {B {x:T}}'も同じ方法で初期化する必要があります。 – lukwol

関連する問題