2017-01-11 7 views
6

私は構造体のジェネリックフィールドのデータ型にマッチして、それに応じて反応しようとしています。 rustcからのエラーメッセージ錆のデータ型のマッチング方法は?

struct foo<T> { 
    zaz: String, 
    bar: T, 
} 

fn main() { 
    let x = foo::<String> { 
     zaz: "Hello".to_string(), 
     bar: "world".to_string(), 
    }; 
    let y = foo::<u32> { 
     zaz: "Hello".to_string(), 
     bar: 5, 
    }; 

    match x.bar { 
     String => println!("It's a string!"), 
     u32 => println!("It's a u32!"), 
     _ => println!("Something else"), 
    }; 

    println!("end of program!"); 
} 

error[E0001]: unreachable pattern 
    --> src/main.rs:18:9 
    | 
18 |   u32 => println!("It's a u32!"), 
    |   ^^^ this is an unreachable pattern 
    | 
note: this pattern matches any value 
    --> src/main.rs:17:9 
    | 
17 |   String => println!("It's a string!"), 
    |   ^^^^^^ 

error[E0001]: unreachable pattern 
    --> src/main.rs:19:9 
    | 
19 |   _ => println!("Something else"), 
    |  ^this is an unreachable pattern 
    | 
note: this pattern matches any value 
    --> src/main.rs:17:9 
    | 
17 |   String => println!("It's a string!"), 
    |   ^^^^^^ 

私が欲しかったものが最初のものと一致するようにx、と一致するyのためだった私の一般的な考え方は、この(コードはコンパイルされません)のようでした2番目のもの。私は実際に私がやりたいことができるかどうか分からないが、望む効果を達成するにはどうすればよいだろうか?

+0

短い答えは「右のバットではない」であることをいたしません。この質問は役に立ちます:[Rustはどのようにリフレクションを実装していますか?](0120-17753-03) –

+0

Rustは、構造体、列挙型、および特性に 'CamelCase'を使用します。 'Foo'を使うべきです。 – Shepmaster

答えて

8

慣用的解決

fooのパラメータTを拘束形質を作成し、この形質の関連する機能のような任意の特定の動作を実現します。

例:何の驚きがないように

trait PrintMe { 
    fn print_me(&self); 
} 

impl PrintMe for String { 
    fn print_me(&self) { println!("I am a string"); } 
} 

struct Foo<T: PrintMe> { 
    zaz: String, 
    bar: T 
} 

fn main() { 
    // ... 
    x.bar.print_me(); 
} 

これは、あなたが正確に可能ジェネリックパラメータの動作の違いを宣言原則に基づいジェネリックプログラミング、です。


厳密解

錆ことができ、実際のクエリの種類:各タイプは、関連するユニークなTypeIdを持っており、あなたがif一連のチェックをTypeIdに一致させることができます。それはclunkyです。

fn print_me<T>(x: &Foo<T>) { 
    if TypeId::of::<T>() == TypeId::of::<String>() { 
     println!("I am a string"); 
    } else // ... 
} 

しかしください... :)

+0

ありがとう、マチュー。それは物事をクリアする。私は一般的に私のデザインを変更する必要があると思う、私は自分のコード "Cスタイル"をレイアウトし続けます。ありがとう! – Dash83

+0

+1「しないでください」と書いてありますが、Rust *には「enum」があることを指摘します。これは、より良い(より短く、明確で、熟語的でコンパイル時にチェックされた) TypeId :: of'チェック。 – trentcl

+0

@trentcl:それは依存します。 'enum'はクローズドポリモーフィズム、' trait'はオープンポリモーフィズムを意味します。 @MatthieuM。 –

関連する問題