TIL

아이템 15 리시버를 명시적으로 참조하라

class User: Person() {
	private var beersDrunk: Int = 0
	
	fun drinkBeers(num: Int)) {
		// ...
		this.berrsDrunk += num
		// ...
	}
}

여러 개의 리시버

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")
}
class Node(val name: String) {
	fun makeChild(childName: String) = 
		create("$name.$childName")
			.apply { print("Created ${this?.name}") }
}
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}") }
}

DSL 마커

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

정리