Сопоставление с шаблоном

case x of
    1 -> "one"
    2 -> "two"
    else -> fail

case char of
    'A' -> 1
    'B' -> 2
    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

Ключевое слово t@ позволяет указать существующий тип.

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.

if maybe_x @ Some x then
    println x

Выражение в условии проверяет maybe_x на соответствие одному шаблону.