haxe
パターンマッチング
サーチ…
備考
パターンマッチングは、提供されたパターンに応じて分岐するプロセスです。すべてのパターンマッチングは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 => matchはextractorExpression => match式で識別されます。抽出子は、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