fun String.lastChar(): Char {
return this.get(this.length - 1)
}
"jason".lastChar() //위와 같이 만들면 이런 확장함수 처럼 보이게 할 수 있음
fun Any.to(other: Any) = Pair(this, other)
인자가 2개임
infix는 무조건 single Value parameter 여야한다.
operator fun plus : 사용 시 '+' 를 원하는 대로 사용
get 메서드가 연산자 오버로딩과 관련있다.
=> 원래 get이라는 함수가 있는데 오버로딩 된 함수이다.
val sb = StringBuilder()
sb.apply {
this.append("Yes")
append("No")
}.also {
/*...*/
}.let {
/*...*/
}
=> 말이 되면 가능~! 막 추가해서 쓸 수 있음
=> 왜 굳이 apply를 써야할까? 생각해보기
introduce {
name("박재성")
company("우아한형제들")
skills {
soft("A passion for problem solving")
soft("Good communication skills")
hard("Kotlin")
}
languages {
"Korean" level 5
"English" level 3
}
}
class DslTest{
@Test
fun name() {
val person = introduce{
name("박재성")
}
assertThat(person.name).isEqaulTo("제이슨")
}
}
@Test
fun company() {
val person = introduce{
name("박재성")
company("우아한테크코스")
}
assertThat(person.name).isEqaulTo("제이슨")
assertThat(person.company).isEqaulTo("우아한테크코스")
}
}
//Person의 아무 함수나 받겠다는 뜻
//block이란 함수 갖고 있음
fun introduce(block: Person.() -> Unit): Person {
//1
//return Person().apply {
// block
//}
//2
return Person().apply(block)
//3
//val person = Person()
//person.block()
//return person
}
data class Person (){
var name : String = ""
var company: String = ""
fun name(name: String) {
this.name = name
}
fun company(company: String) {
this.company = company
}
}