수색…
소개
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
.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow