科特林:如何通过一个函数作为参数传递给另一个?(Kotlin: how to pass a func

2019-08-31 14:59发布

鉴于函数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("a message", buz)

Answer 1:

使用::来表示一个函数引用,然后:

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

由于科特林1.1现在可以使用的类成员(“ 绑定可赎回参考 ”)功能,通过前缀与实例函数参考操作:

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

foo("hi", thatOtherThing::buz)

foo("hi", this::buz)


Answer 2:

关于成员函数的参数:

  1. 科特林类不支持静态成员函数,所以成员函数不能被调用,如:操作员::加(5,4)
  2. 因此,成员函数不能被用作与第一级的功能。
  3. 一个有用的方法是用一个lambda来包装的功能。 这不是优雅,但至少这是工作。

码:

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


Answer 3:

显然,这是没有支持。

更多信息:

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

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



Answer 4:

就在方法名称中使用“::”

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

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

foo(::bar) 输出Hello World



Answer 5:

科特林1.1

使用::到参考方法。

喜欢

    foo(::buz) // calling buz here

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


Answer 6:

如果你想通过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 })


Answer 7:

杰森 - 米纳德的回答是一个很好的一个。 这也可以使用实现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")
}


Answer 8:

一流的功能目前不支持科特林。 还有的是是否这将是一个很好的功能添加辩论。 我个人认为他们应该。



文章来源: Kotlin: how to pass a function as parameter to another?
标签: kotlin