다음 예제의 ordinal()은 독일어로 된 기수(수량을 세는 단어)로부터 서수(순서를 세는 단어)를 얻는다. 아래 코드는 정수를 미리 정해진 몇 가지 수와 비교해서 일반적인 규칙을 적용할지, 예외 규칙을 적용할지 검사한다(독일어에서는 고통스럽게도 예외 규칙을 적용해야 하는 경우가 흔하다).
WhenExpressions/GermanOrdinals.kt
package whenexpressions
import atomictest.eq
val numbers = mapOf(
1 to "eins", 2 to "zwei", 3 to "drei",
4 to "vier", 5 to "fuenf", 6 to "sechs",
7 to "sieben", 8 to "acht", 9 to "neun",
10 to "zehn", 11 to "elf", 12 to "zwoelf",
13 to "dreizehn", 14 to "vierzehn",
15 to "fuenfzehn", 16 to "sechzehn",
17 to "siebzehn", 18 to "achtzehn",
19 to "neunzehn", 20 to "zwanzig"
)
fun ordinal(i: Int): String =
when (i) { // [1]
1 -> "erste" // [2]
3 -> "dritte"
7 -> "siebte"
8 -> "achte"
20 -> "zwanzigste"
else -> numbers.getValue(i) + "te" // [3]
}
fun main() {
ordinal(2) eq "zweite"
ordinal(3) eq "dritte"
ordinal(11) eq "elfte"
}
• [1] when 식은 i를 본문의 매치식과 비교한다.
• [2] 가장 먼저 일치하는 매치식에서 when 식의 실행이 끝난다. 여기서는 String 값이 생성되며, 이 값이 ordinal()의 반환값이 된다.
• [3] else 키워드는 일치하는 매치식이 없을 때 대안으로 사용할 식을 제공한다. else는 항상 매치 목록의 맨 마지막에 있어야 한다. 2를 사용해 테스트한 경우, 이 값은 1, 3, 7, 8, 20과 일치하지 않으므로 else가 선택된다.