[kotlin] Kotlin : 함수를 다른 매개 변수로 전달하는 방법은 무엇입니까?

주어진 함수 foo :

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

우리는 할 수 있습니다 :

foo("a message", { println("this is a message: $it") } )
//or 
foo("a message")  { println("this is a message: $it") }

이제 다음과 같은 기능이 있다고 가정 해 보겠습니다.

fun buz(m: String) {
   println("another message: $m")
}

“buz”를 “foo”에 매개 변수로 전달할 수있는 방법이 있습니까? 다음과 같은 것 :

foo("a message", buz)



답변

::함수 참조를 나타내는 데 사용 하고 다음을 수행하십시오.

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

// my function to pass into the other
fun buz(m: String) {
    println("another message: $m")
}

// someone passing buz into foo
fun something() {
    foo("hi", ::buz)
}

Kotlin 1.1부터는 함수 참조 연산자에 인스턴스 접두어를 붙여 클래스 멤버 인 함수 ( ” Bound Callable References “)를 사용할 수 있습니다 .

foo("hi", OtherClass()::buz)

foo("hi", thatOtherThing::buz)

foo("hi", this::buz)


답변

매개 변수로서 멤버 함수 정보 :

  1. Kotlin 클래스는 정적 멤버 함수를 지원하지 않으므로 다음과 같이 멤버 함수를 호출 할 수 없습니다. Operator :: add (5, 4)
  2. 따라서 멤버 함수는 퍼스트 클래스 함수와 동일하게 사용할 수 없습니다.
  3. 유용한 접근 방식은 함수를 람다로 감싸는 것입니다. 우아하지는 않지만 적어도 작동하고 있습니다.

암호:

class Operator {
    fun add(a: Int, b: Int) = a + b
    fun inc(a: Int) = a + 1
}

fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b)
fun calc(a: Int, opr: (Int) -> Int) = opr(a)

fun main(args: Array<String>) {
    calc(1, 2, { a, b -> Operator().add(a, b) })
    calc(1, { Operator().inc(it) })
}


답변

코 틀린 1.1

방법 ::을 참조 하는 데 사용 합니다.

처럼

    foo(::buz) // calling buz here

    fun buz() {
        println("i am called")
    }


답변

메소드 이름 앞에 “::”를 사용하십시오.

fun foo(function: () -> (Unit)) {
   function()
}

fun bar() {
    println("Hello World")
}

foo(::bar) 출력 :Hello World


답변

분명히 이것은 아직 지원되지 않습니다.

더 많은 정보:

http://devnet.jetbrains.com/message/5485180#5485180

http://youtrack.jetbrains.com/issue/KT-1183


답변

settergetter 메소드 를 전달하려는 경우 .

private fun setData(setValue: (Int) -> Unit, getValue: () -> (Int)) {
    val oldValue = getValue()
    val newValue = oldValue * 2
    setValue(newValue)
}

용법:

private var width: Int = 1

setData({ width = it }, { width })


답변

Jason Minard의 대답은 좋은 것입니다. 이것은를 사용하여 달성 할 수도 있습니다 lambda.

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

val buz = { m: String ->
    println("another message: $m")
}

로 호출 할 수 있습니다 foo("a message", buz).

를 사용하여 이것을 조금 더 건조하게 만들 수도 있습니다 typealias.

typealias qux = (m: String) -> Unit

fun foo(m: String, bar: qux) {
    bar(m)
}

val buz: qux = { m ->
    println("another message: $m")
}