在扩展函数中传递带有参数的函数(kotlin)
pass function with parameters in extension function(kotlin)
- 我正在尝试使用 Handlers 在 android 中创建一个
Extension function
但面临问题:
扩展乐趣代码:
fun delayTask(millis: Long, myFunction: (data:String) -> Unit) {
Handler().postDelayed({
myFunction(data) //why error is of data here
}, millis)
}
这样调用:
delayTask(500, ::function)
- 出现错误未解决的引用:数据
data
不是您的高阶函数的参数。它是您的函数参数的参数。所以你传递给传递的函数是不存在的
为了能够将此数据传递给您的 lambda,您需要将其添加为另一个参数:
fun delayTask(millis: Long, data: String, myFunction: (String) -> Unit) {
Handler().postDelayed({
myFunction(data)
}, millis)
}
当你调用它时,你还必须传递数据:
delayTask(500, someDataString, ::function)
通过从函数参数中删除参数,您的函数可以更加通用。然后你可以通过将它包装在 lambda 中来调用具有任意数量参数的任何函数:
fun delayTask(millis: Long, myFunction: () -> Unit) {
Handler().postDelayed({
myFunction()
}, millis)
}
delayTask(500) { myFunction(someData) }
出于性能原因,最好将其内联。但是传递的函数必须是 crossinline
因为它被包装在另一个对象中并稍后调用:
inline fun delayTask(millis: Long, crossinline myFunction: () -> Unit) {
Handler().postDelayed({
myFunction()
}, millis)
}
请注意,Android Ktx core
:
中的 postDelayed
function 已提供此功能
Handler().postDelayed(500L) { someFunction() }
- 我正在尝试使用 Handlers 在 android 中创建一个
Extension function
但面临问题:
扩展乐趣代码:
fun delayTask(millis: Long, myFunction: (data:String) -> Unit) {
Handler().postDelayed({
myFunction(data) //why error is of data here
}, millis)
}
这样调用:
delayTask(500, ::function)
- 出现错误未解决的引用:数据
data
不是您的高阶函数的参数。它是您的函数参数的参数。所以你传递给传递的函数是不存在的
为了能够将此数据传递给您的 lambda,您需要将其添加为另一个参数:
fun delayTask(millis: Long, data: String, myFunction: (String) -> Unit) {
Handler().postDelayed({
myFunction(data)
}, millis)
}
当你调用它时,你还必须传递数据:
delayTask(500, someDataString, ::function)
通过从函数参数中删除参数,您的函数可以更加通用。然后你可以通过将它包装在 lambda 中来调用具有任意数量参数的任何函数:
fun delayTask(millis: Long, myFunction: () -> Unit) {
Handler().postDelayed({
myFunction()
}, millis)
}
delayTask(500) { myFunction(someData) }
出于性能原因,最好将其内联。但是传递的函数必须是 crossinline
因为它被包装在另一个对象中并稍后调用:
inline fun delayTask(millis: Long, crossinline myFunction: () -> Unit) {
Handler().postDelayed({
myFunction()
}, millis)
}
请注意,Android Ktx core
:
postDelayed
function 已提供此功能
Handler().postDelayed(500L) { someFunction() }