1前書き

Kotlinは、クリーンで読みやすいコードを書くことを可能にするために多くの新鮮な機能を追加する言語です。

これにより、コードの保守が大幅に簡単になり、開発の成果が上がります。


Infix notation

はそのような機能の1つです。


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

Kotlinでは、ピリオドと括弧を使わずにいくつかの関数を呼び出すことができます。 ** これらは

infix

メソッドと呼ばれており、それらを使用すると自然言語のように見えるコードになります。

これはインライン

Map

定義で最もよく見られます。

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


“ to”

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

Pair <A、B> .

を返す

to()

メソッドです。


3共通標準ライブラリ中置関数


Pair <A、B>

インスタンスを作成するために使用される

to()

関数の他に、

infix.

として定義されている他の関数がいくつかあります。

たとえば、

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()、または()

および

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. 関数がc

    __lass

    __で定義されているか、または拡張です.

c

__lass

__のメソッド
。この関数は正確に1つのパラメータを取ります

  1. 関数は

    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概要

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

いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[over on GitHub]にあります。