haxe
Согласование образцов
Поиск…
замечания
Согласование шаблонов - это процесс разветвления в зависимости от предоставленных шаблонов. Все сопоставления с образцом выполняются внутри выражения switch , а отдельные выражения case представляют шаблоны.
Основные правила сопоставления шаблонов:
- шаблоны всегда будут сопоставляться сверху донизу;
- самый верхний шаблон, который соответствует входному значению, выполняет свое выражение;
- a
_соответствует всем, поэтомуcase _:равен поdefault:
Когда обрабатываются все возможные случаи, шаблон catch-all _ или случай по 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-pattern имеется захваченная переменная, она должна отображаться в обоих под-образцах.
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 . Экстракторы состоят из двух частей, разделенных оператором => .
- Левая сторона может быть любым выражением, где все вхождения символа подчеркивания
_заменяются текущим совпадающим значением. - Правая сторона - это шаблон, который сопоставляется с результатом оценки левой стороны.
Так как правая сторона является шаблоном, она может содержать другой экстрактор. Следующий пример «цепочки» двух экстракторов:
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;
}
В настоящее время невозможно использовать экстракторы внутри или-шаблонов. Тем не менее, можно иметь или-шаблоны с правой стороны экстрактора.