Сопоставление с шаблоном
case x of
1 -> true
2 -> false
else -> fail
case c of
'A' -> true
'B' -> false
else -> fail
case s of
"one" -> 1
"two" -> 2
"3" | "three" -> 3
else -> fail
Можно сравнить значение с числовыми, знаковыми и строковыми литералами.
case maybe_x of
Some x -> x
None -> 0
Именованный кортеж и символ.
case maybe_x of
is Some -> true
is None -> false
Some и None являются типами, поэтому могут быть частью is шаблона.
type Value =
| t@ i32
| t@ String
case value of
x : i32 -> x
s : String -> i32.parse s
Значение проверяется на соответствие типу и записывается в x или s.
case value of
is i32 -> value
is String -> i32.parse value
Привязка value имеет тип i32 в первой руке и String во второй.
case key of
Key/Enter -> ...
Key/C if mods.contains KeyModifiers/Control -> ...
...
К шаблону можно добавить условие.
case (maybe_x, maybe_y) of
Some x, Some y -> x + y
Some x, None -> x
None, Some y -> y
None, None -> 0
Скобки кортежа не обязательны.
case maybe_vector of
Some vector@mut_ref -> vector.x = 0
None -> ()
maybe_vector будет изменён, если содержит значение Some. Также доступны модификаторы @ref, @ptr и @mut_ptr.
case button
of MouseButton/Left -> ...
else MouseButton/Right -> ...
else ->
...
Другой способ записи case of позволяет сократить количество отступов с двух до одного.
if maybe_x ? Some x then
println x
Выражение в условии проверяет maybe_x на соответствие одному шаблону.