1. 序章

Kotlinは、多くの新しい機能を追加して、よりクリーンで読みやすいコードを記述できるようにする言語です。

これにより、コードの保守が大幅に容易になり、開発の最終結果が向上します。 中置記法はそのような機能の1つです。

2. 中置記法とは何ですか?

Kotlinでは、ピリオドとブラケットを使用せずに一部の関数を呼び出すことができます。 これらは中置メソッドと呼ばれ、それらを使用すると、自然言語に非常によく似たコードになる可能性があります。

これは、インラインMap定義で最も一般的に見られます。

map(
  1 to "one",
  2 to "two",
  3 to "three"
)

“に” 特別なキーワードのように見えるかもしれませんが、この例では、これはに() 中置記法を利用してペア

3. 一般的な標準ライブラリの中置関数

離れてに() 作成に使用される関数ペアインスタンス、として定義されている他のいくつかの関数があります中置。

たとえば、さまざまな数値クラス( Byte、 Short、Int、 Long )はすべて、ビット関数 and()、または()を定義します。 、shl()、shr()、ushr()、および xor()、より読みやすい式を許可します。

val color = 0x123456
val red = (color and 0xff0000) shr 16
val green = (color and 0x00ff00) shr 8
val blue = (color and 0x0000ff) shr 0

Boolean クラスは、 and()、または() and xor( 論理関数を同様の方法で定義します。

if ((targetUser.isEnabled and !targetUser.isBlocked) or currentUser.admin) {
    // Do something if the current user is an Admin, or the target user is active
}

String クラスは、matchおよびzip関数も中置として定義し、読みやすいコードをいくつか許可します。

"Hello, World" matches "^Hello".toRegex()

標準ライブラリ全体で見つけることができる他のいくつかの例がありますが、これらはおそらく最も一般的です。

4. カスタム中置メソッドの記述

多くの場合、独自のインフィックスメソッドを作成する必要があります。 これらは、たとえば、アプリケーションのドメイン固有言語を記述して、DSLコードをはるかに読みやすくする場合に特に役立ちます。

いくつかのKotlinライブラリは、すでにこれを使用して大きな効果を上げています。

たとえば、 mockito-kotlin ライブラリは、モック動作を定義するときに使用するいくつかのインフィックス関数— doAnswer doReturn、および doThrow —を定義します。 。

中置関数の記述は、次の3つのルールの単純なケースです。

  1. この関数は、ac lass で定義されているか、ac lassの拡張メソッドです。
  2. 関数は正確に1つのパラメーターを取ります
  3. 関数はinfixキーワードを使用して定義されます

簡単な例として、テストで使用する簡単なAssertionフレームワークを定義しましょう。 中置関数を使用して、左から右に適切に読み取る式を許可します。

class Assertion<T>(private val target: T) {
    infix fun isEqualTo(other: T) {
        Assert.assertEquals(other, target)
    }

    infix fun isDifferentFrom(other: T) {
        Assert.assertNotEquals(other, target)
    }
}

これはシンプルに見え、他のKotlinコードと何ら変わらないようです。 ただし、 infix キーワードが存在すると、次のようなコードを記述できます。

val result = Assertion(5)

result isEqualTo 5 // This passes
result isEqualTo 6 // This fails the assertion
result isDifferentFrom 5 // This also fails the assertion

すぐに、これは読みやすく、理解しやすくなります。

中置関数は既存のクラスの拡張メソッドとしても記述できることに注意してください。 これは、標準ライブラリを含む他の場所の既存のクラスをニーズに合わせて拡張できるため、強力な場合があります。

たとえば、 String に関数を追加して、特定の正規表現に一致するすべてのサブストリングを引き出しましょう。

infix fun String.substringMatches(r: Regex) : List<String> {
    return r.findAll(this)
      .map { it.value }
      .toList()
}

val matches = "a bc def" substringMatches ".*? ".toRegex()
Assert.assertEquals(listOf("a ", "bc "), matches)

5. 概要

このクイックチュートリアルでは、既存の関数を使用する方法や、コードをよりクリーンで読みやすくするために独自の関数を作成する方法など、中置関数で実行できるいくつかのことを示します。

いつものように、コードスニペットはGitHubにあります。