this
를 명시적으로 사용class User: Person() {
private var beersDrunk: Int = 0
fun drinkBeers(num: Int)) {
// ...
this.berrsDrunk += num
// ...
}
}
apply
, with
, run
함수 등을 사용할 때class Node(val name: String) {
fun makeChild(childName: String) =
create("$name.$childName")
.apply { print("Created ${name}") }
fun create(name: String): Node? = Node(name)
}
fun main() {
val node = Node("parent")
node.makeChild("child")
}
this
의 타입이 Node?
이기에 이를 직접 사용할 수 없고 safe call을 사용해야 한다.class Node(val name: String) {
fun makeChild(childName: String) =
create("$name.$childName")
.apply { print("Created ${this?.name}") }
}
apply
의 잘못된 사용 예인데 also
를 사용했다면 명시적 리시버를 지정하게 된다.
also
또는 let
이 훨씬 좋은 선택지이다.class Node(val name: String) {
fun makeChild(childName: String) =
create("$name.$childName")
.also { print("Created ${it?.name}") }
}
class Node(val name: String) {
fun makeChild(childName: String) =
create("$name.$childName")
.apply { print("Created ${this?.name} in ${this@Node.name}") }
}
table {
tr {
td { +"Column 1" }
td { +"Column 2" }
}
tr {
td { +"Value 1" }
td { +"Value 2" }
}
}
table {
tr {
td { +"Column 1" }
td { +"Column 2" }
tr {
td { +"Value 1" }
td { +"Value 2" }
}
}
}
@DslMarker
annotation class HtmlDsl
fun table(f: TableDsl.() -> Unit) { /*...*/ }
@HtmlDsl
class TableDsl { /*...*/ }
table {
tr {
td { +"Column 1" }
td { +"Column 2" }
tr { // 컴파일 오류
td { +"Value 1" }
td { +"Value 2" }
}
}
}
table {
tr {
td { +"Column 1" }
td { +"Column 2" }
this@table.tr {
td { +"Value 1" }
td { +"Value 2" }
}
}
}