खोज…


परिचय

कोटलिन में आंतरिक डीएसएल को डिजाइन करने के लिए सिंटैक्स विवरण पर ध्यान दें।

DSL बनाने के लिए Infix अप्रोच

यदि आपके पास है:

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

आप अपने परीक्षणों में निम्न DSL जैसा कोड लिख सकते हैं:

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

डीएसएल बनाने के लिए इनवोक विधि को ओवरराइड करना

यदि आपके पास है:

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()
}

आप निम्न डीएसएल-जैसे कोड लिख सकते हैं:

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}") }
}

आप निम्न डीएसएल-जैसे कोड लिख सकते हैं:

"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