サーチ…


備考

パターンマッチングは、提供されたパターンに応じて分岐するプロセスです。すべてのパターンマッチングはswitch式内で行われ、個々のcase式がパターンを表します。

パターンマッチングの基本的なルールは次のとおりです。

  • パターンは常に上から下にマッチします。
  • 入力値と一致する一番上のパターンはその式が実行されます。
  • _パターンは何にもマッチするので、 case _:default:等しい。

すべての可能なケースが処理されるときに、キャッチオール_パターンやdefault場合は必要ありません。

列挙型の照合

次の列挙型を仮定します。

enum Operation {
    Multiply(left : Int, right : Int);
}

列挙型照合は、次のように実行できます。

var result = switch(Multiply(1, 3)) {
    case Multiply(_, 0):
        0;
    case Multiply(0, _):
        0;
    case Multiply(l, r):
        l * r;
}

参考文献

構造マッチング

次の構造を仮定します。

var dog = {
    name : "Woofer",
    age : 7
};

列挙型照合は、次のように実行できます。

var message = switch(dog) {
    case { name : "Woofer" }:
        "I know you, Woofer!";
    case _:
        "I don't know you, sorry!";
}

参考文献

配列の一致

var result = switch([1, 6]) {
    case [2, _]:
        "0";
    case [_, 6]:
        "1";
    case []:
        "2";
    case [_, _, _]:
        "3";
    case _:
        "4";
}

参考文献

またはパターン

|演算子はパターン内のどこでも使用でき、複数の受け入れられたパターンを記述できます。 or-パターンにキャプチャされた変数がある場合は、その両方のサブパターンに現れなければなりません。

var match = switch(7) {
    case 4 | 1: "0";
    case 6 | 7: "1";
    case _: "2";
}

参考文献

警備員

ガード付きのパターンをさらに制限することもできます。これらはcase ... if(condition):構文で定義されます。

var myArray = [7, 6];
var s = switch(myArray) {
    case [a, b] if (b > a):
        b + ">" +a;
    case [a, b]:
        b + "<=" +a;
    case _: "found something else";
}

参考文献

抽出器

extractorExpression => matchextractorExpression => match式で識別されます。抽出子は、2つの部分で構成され、 =>演算子で区切られています。

  1. 左側には任意の式を指定できます。アンダースコア_すべてが現在一致した値に置き換えられます。
  2. 右辺は、左辺の評価結果と照合されるパターンである。

右側はパターンなので、別の抽出子を含むことができます。次の例では、2つの抽出子を「チェーン」しています。

static public function main() {
    switch(3) {
        case add(_, 1) => mul(_, 3) => a:
            trace(a); // mul(add(3 + 1), 3)
    }
}

static function add(i1:Int, i2:Int) {
    return i1 + i2;
}

static function mul(i1:Int, i2:Int) {
    return i1 * i2;
}

現時点では、or-pattern内でエクストラクタを使用することはできません。しかし、エクストラクタの右側にor-patternを持つことは可能です。

参考文献



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow