2016-11-10 9 views
1

複数のタイプのパターンと錆のパターンマッチングが可能ですか?あなたができないかのように思えます。そうでない場合は、それを追加する予定のサポートはありますか、実行時型情報(RTTI)ですか?複数のタイプとの錆パターンのマッチング

struct Bus; 
struct Car; 
struct Person; 

fn main() { 
    let x = Bus; 
    //or more realistically, let x = function_with_multiple_return_types(); 

    match x { 
     Car => { 
      // ... 
     } 
     Bus => { 
      // this gets executed 
     } 
     Person => { 
      // ... 
     } 
    } 
} 

この例は簡単です。実際の生活では、xが複数のタイプである場合にのみ役立ちます。例えばlet x = function_with_multiple_return_types();。 Shepmasterによると、Lustとは異なり、Rustは静的に型付けされているため、これは不可能です。

+0

Idk錆ですが、私は試合の各節が同じ種類である必要があると思います。それらをすべて同じスーパークラス/インタフェースの一部にするようにしてください – Carcigenicate

+0

あなたが得ることができる最も近いものは、[here](https://doc.rust-lang.org/book/enums.html)のようなタグ付きの共用体かもしれません。 – squiguy

答えて

2

機能は、が実装されるかどうかを100%正確に言うことはできませんが、これは決して実装されないという100%の信念をもって言えます。

なぜですか?提案された構文にはゼロの利益があるからです。錆は、静的型の言語です。つまり、コンパイラは、変数のタイプが何であるかをは知っています。 Bus以外のブランチが実行されることはありません。変数に複数の型を持たせる方法はありません。あなたは決して使用できないコードを追加できるように言語が変わるのですか?それはあまり役に立たないでしょう。

一般的に、マッチステートメントとパターンマッチングは、複数の可能なバリアントがある場合にのみ有効です。だから、Rustはenumです。動的選択の固定されたセット(実行時に作られたa.k.a)を可能にする。

オープンなダイナミックな意思決定が必要な場合は、それがどのような特徴(そしておそらく特殊化)であるのかが分かります。また、any concrete typeを可能にする特性があります。

+0

あなたの答えをありがとう。 – randyrand

+0

私の質問は、Matchがさまざまな種類に分岐する可能性のあるラケット通訳からインスピレーションを受けました。もちろん、Lispは動的に型付けされているので、Rustでは理にかなっているので、これは通常は有用ではありません。私はそこには、関数の戻り値の型を動的に役立つ可能性があるニッチなケースがあるかもしれないと感じます(しかし、idomaticではありません) - std :: anyは主にこのユースケースをカバーするようです。ありがとう! – randyrand

+0

Lispに動的に型指定されているのは、私の最初の混乱がどこから来たのかです。 – randyrand

関連する問題