サーチ…


前書き

Kotlinの内部DSLを設計するための構文の詳細に注目してください。

DSLを構築するためのインフィクスアプローチ

あなたが持っている場合:

infix fun <T> T?.shouldBe(expected: T?) = assertEquals(expected, this)

あなたのテストでは、次のようなDSLのようなコードを書くことができます:

@Test
fun test() {
  100.plusOne() shouldBe 101
}

DSLを構築するためのinvokeメソッドのオーバーライド

あなたが持っている場合:

class MyExample(val i: Int) {
  operator fun <R> invoke(block: MyExample.() -> R) = block()
  fun Int.bigger() = this > i
}

プロダクションコードに以下のDSLのようなコードを書くことができます:

fun main2(args: Array<String>) {
    val ex = MyExample(233)
    ex {
        // bigger is defined in the context of `ex`
        // you can only call this method inside this context
        if (777.bigger()) kotlin.io.println("why")
    }
}

ラムダでの演算子の使用

あなたが持っている場合:

val r = Random(233)
infix inline operator fun Int.rem(block: () -> Unit) {
  if (r.nextInt(100) < this) block()
}

以下のDSLのようなコードを書くことができます:

20 % { println("The possibility you see this message is 20%") }

ラムダでの拡張機能の使用

あなたが持っている場合:

operator fun <R> String.invoke(block: () -> R) = {
  try { block.invoke() }
  catch (e: AssertException) { System.err.println("$this\n${e.message}") }
}

以下のDSLのようなコードを書くことができます:

"it should return 2" {
   parse("1 + 1").buildAST().evaluate() shouldBe 2
}

あなたが上記のshouldBeと混同していると感じたら、 Infix approach to build DSL shouldBe Infix approach to build DSLの例を参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow