如何在Kotlin中传递带有参数的函数引用?类似于javascript

时间:2019-07-19 08:13:36

标签: javascript function kotlin

编辑开始:

您可以在下面的repl中尝试以下两个代码片段,以查看我想要的内容。

Kotlin代码(无效,在onComplete函数调用中要求输入参数)

fun toPass(name: String, age: Int) {
  println("Name is $name and age is $age")
}

toPass("Hakan", 26)

fun test(title: String, onComplete: (String, Int) -> Unit) {
  println("from test")
  onComplete()
  println("from test END")
}

test("customTitle", toPass("Emre", 32))

JavaScript代码(工程)

function toPass(name, age) {
  console.log(`Name is ${name} and age is ${age}`)
}

toPass("Hakan", 26)

function test(title, onComplete) {
  console.log("from test")
  onComplete()
  console.log("from test END")
}

test("customTitle", toPass.bind("Emre", 32))

编辑结束

///////////////////////////////////////////////// ////////

我想将一个函数作为onComplete回调传递给另一个函数。

原因是回调将把本地范围内的引用作为参数。所以我想在这里利用闭包来解决我的问题。就像在javascript中一样。

我想将一些参数绑定到我要传递的函数上。

fun functionToPass(name: String, age: Int){

}

fun someProcess(title: String, onComplete: (String, Int) -> Unit){
  var builder = AlertDialog.Builder()
  ...
  .setPositiveButton(android.R.string.ok, object: DialogInterface.OnClickListener{
    override fun onClick(dialog: DialogInterface?, which: Int) {
      onComplete()
    }
  })
  ...
  ...
  builder.create().show()
}

我想在下面做,我用javascript编写了下面的代码,它将值绑定到“名称”和“年龄”参数

someProcess("MyTitle", functionToPass.bind("Hakan", 26))

我如何在Kotlin中做同样的事情?我只知道如何发送引用,但是我想绑定值以使用闭包,这样对我来说更容易编写代码逻辑。

谢谢

我已经检查了Kotlin文档,但仅显示了如何传递引用,没有显示在传递引用时将值绑定到参数的示例。

2 个答案:

答案 0 :(得分:1)

我不确定我是否真的理解问题,但是我认为您可以执行以下操作:

=IFERROR(SUM(INDEX('I:\Original Folder\Data Folder\Counts Folder\Reports Folder\2019\July\[Counts_”&D1&”.xlsx]General1'!D$4:XFD$500,,MATCH(A2,'I:\Original Folder\Data Folder\Counts Folder\Reports Folder\2019\July\[Counts_”&D1&”.xlsx]General1'!D$2:XFD$2,0))),SUM(INDEX('I:\Original Folder\Data Folder\Counts Folder\Reports Folder\2019\July\[Counts_”&D1&”.xlsx]General2'!D$4:XFD$500,,MATCH(A2, 'I:\Original Folder\Data Folder\Counts Folder\Reports Folder\2019\July\[Counts_”&D1&”.xlsx]General2'!D$2:XFD$2,0))))

您可以这样称呼它:

func apply<T>(_ f:(T ...) -> T, with elements:[T]) -> T {
   var elements = elements

   if elements.count == 0 {
       return f()
   }

   if elements.count == 1 {
       return f(elements[0])
   }

   var result:T = f(elements.removeFirst(), elements.removeFirst())

   result = elements.reduce(result, {f($0, $1)} )

   return result
}

答案 1 :(得分:0)

为什么不传递lambda函数作为参数?

此外,它与Kotlin函数的工作方式相同

someProcess("My title", { "Hakan", 26 -> yourLogic })