Kotlin invoke()

Jmnote (토론 | 기여)님의 2019년 4월 18일 (목) 03:21 판

1 개요

Kotlin invoke()
  • 인스턴스 변수를 함수처럼 사용할 수 있게 해준다.
호출하면 invoke() 함수가 실행되는 것.
  • 일반적으로 자신(this)을 반환하여, invoke를 반복할 수 있게 한다.
  • 반드시 그래야 하는 것은 아니다. 다만 자신을 반환하지 않으면 invoke를 반복할 수 없겠지.
  • invoke() 함수도 인수를 받을 수 있다.
  • 용도는 음... 잘 모르겠다.
일반적으로 this를 반환하는 경우는 chaining을 위한 것인데...
class Foo {
    var count = 0
    operator fun invoke(): Foo {
        count++
        return this
    }
}
fun main(args: Array<String>) {
    val foo = Foo()
    foo()()()()()
    println("foo.count=${foo.count}")
    // foo.count=5
}
class Invokable {
    var numberOfInvocations: Int = 0
        private set
    operator fun invoke(): Invokable {
        numberOfInvocations++
        println("numberOfInvocations=${numberOfInvocations}");
        return this
    }
}
fun invokeTwice(invokable: Invokable) = invokable()()
fun main(args: Array<String>) {
    invokeTwice(Invokable())
    // numberOfInvocations=1
    // numberOfInvocations=2
}
class Foo {
    var count = 0;
    operator fun invoke(): Foo {
        count++
        return this
    }
}
fun invokeTwice(foo: Foo) = foo()()
fun main(args: Array<String>) {
    val foo1 = Foo()
    val foo2 = invokeTwice(foo1)
    println("foo1.count=${foo1.count}") 
    // foo1.count=2
    println("foo2.count=${foo2.count}")
    // foo2.count=2
}
class Person(val name: String) {
    operator fun invoke(): String {
        println("Invoked...");
        return "Hello, I'm ${name}"
    }
}
fun main(args: Array<String>) {
    val p = Person("John")
    println( p() )
    // Invoked...
    // Hello, I'm John
}

2 참고

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}