Tagebuch: Kotlin Pattern Matching

Ich bereite mich auf einen 100% Kotlin Job vor. Als kleines Lernprojekt habe ich kopama (Kotlin Pattern Matching) gestartet, durch das man in when Pattern Matching verwenden kann, das über die einfachen eingebauten Möglichkeiten herausgeht (think Hamcrest Matchers).

Ich bin irgendwie überrascht wie mächtig so Sachen wie infix sind. Vielleicht halte ich auch genau deswegen Abstand von sowas :smiley:

Na ja, am Ende ist alles „nur“ syntaktischer Zucker, mit einer Ausnahme:

inline fun <reified T : Comparable<T>> gt(value: T) = object : Pattern {
    override fun test(obj: Any?) = when (obj) {
        is T -> obj > value
        else -> false
    }
}

Type Erasure austricksen kann Java nicht, um das nachzubauen müsste man Reflection verwenden. In Kotlin ist das auch ziemlich beschränkt, aber auch mächtig wenn es möglich ist.

reified types sind halt leider nur mit „inline“ möglich, was wiederum selbst mit einigen Nachteilen kommt - leider. Tatsächlich finde ich das Type Erasure bei Generics gar nicht so schlimm in Java/Kotlin, ich wüsste gar nicht welche Probleme ich lösen könnte wenn ich das nicht hätte. (?)

Nur, ich habe halt die Möglichkeiten bei Kotlin scheinbar nie wirklich ausgereizt bis jetzt, wenn ich deinen Code anschaue. Ich finde das sehr spannend, wie du da praktisch deine eigene Syntax eingeführt hast.

Inzwischen bin ich recht zufrieden mit der Bibliothek. Habe mir Feedback im Kotlin-Forum geholt, und das hat tatsächlich einige Verbesserungen getriggert:

val p = Person("Alice", "Cooper", 74)

when(match(p)) {
    Person::class("Mick", "Jagger", gt(70)) -> println("Mick Jagger!")
    Person::class("Alice", "Cooper", any) -> println("Alice Cooper!")
    else -> println("I don't know this guy")
}

Es gib eine Menge Zugriffsfunktionen, und es gehen auch „Berechnungen“ wie lt(20) on {p:Person -> "${p.firstName} ${p.lasttName}".length()}