鉴于函数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:
关于成员函数的参数:
- 科特林类不支持静态成员函数,所以成员函数不能被调用,如:操作员::加(5,4)
- 因此,成员函数不能被用作与第一级的功能。
- 一个有用的方法是用一个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:
如果你想通过setter和getter方法。
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?