// HTML을 표현하는 DSL
body {
div {
a("https:/kotlinlang.org") {
target = ATarget.blank
+"Main Site"
}
}
}
fun Routing.api() {
route("news") {
get {
val newsData = NewsUseCase.getAcceptedNews()
call.responsd(newsData)
}
get("propositions") {
requireSecret()
val newsData = NewsUseCase.getPropositions()
call.respond(newsData)
}
}
}
fun plus(a: Int, b: Int) = a + b // 일반 함수
val plus1: (Int, Int) -> Int = { a, b -> a + b } // 람다 표현식
val plus2: (Int, Int) -> Int = fun(a, b) = a + b // 익명 함수
val plus3: (Int, Int) -> Int = ::plus // 함수 레퍼런스
val myPlus = fun Int.(other: Int) = this + other
myPlus.invoke(1, 2) // invoke 사용
myPlus(1, 2) // 확장 함수가 아닌 함수처럼 사용
1.myPlus(2) // 확장 함수로 사용
this
참조 대상을 변경할 수 있다는 점이다.
this
키워드는 확장 리시버(위 코드에선 Int
인스턴스)를 참조한다.fun createTable(): TableDSL = table {
tr {
for (i in 1..2) {
td { +"this is column &i" }
}
}
}
table
함수는 톱레벨에 위치하며 별도 리시버를 갖지 않으므로 table
함수도 톱레벨에 있어야 한다.table
함수 아규먼트 내부에서 tr
을 사용하며 tr
은 table
정의 내부에서만 허용되어야 하기에 table
함수 아규먼트는 tr
함수를 갖는 리시버를 가져야 한다.tr
함수의 아규먼트는 td
함수를 갖는 리시버를 가져야 한다.fun table(init: TableBuilder.() -> Unit): TableBuilder { /*...*/ }
class TableBuilder {
fun tr(init: TrBuilder.() -> Unit) { /*...*/ }
}
class TrBuilder {
fun td(init: TdBuilder.() -> Unit) { /*...*/ }
}