我正在尝试在Kotlin中使用一个函数,以便我可以这样称呼它
myAdditionFunction(1)(2)(3)
此调用将返回6,因为 1+ 2 + 3 = 6
我只需要它对所有数字进行加法运算。其实我真的很想让它做一个建造者 未来的模式,但仍在尝试查看咖喱功能的工作方式。这是我到目前为止所拥有的:
fun myAdditionFunction(x: Int) { { y: Int -> x + y }
这适用于两个参数。 所以myAdditionFunction(1)(2)将显示3。
我希望它可以工作3个或多个:这是我尝试使用3个参数的原因:
fun myAdditionFunction(x: Int) {
var sum = 0
return { y: Int ->
sum = x + y
sum }
}
我如何结转总和以及如何使其具有第三内部函数?它不会编译。
但不会编译
答案 0 :(得分:4)
我不确定您的两个示例中都发生了什么,也没有在我的计算机上编译(Kotlin 1.3.10)。
但是,您可以执行lambda表达式,因为它们允许任意深度嵌套。因此,对于2个变量,您可以拥有
val myAdditionFunction = {x: Int -> {y: Int -> x + y}}
对于三个变量,您可以更进一步:
val myAdditionFunction = {x: Int -> {y: Int -> {z: Int -> x + y + z}}}
仅供参考,lambda表达式(又名匿名函数)的形式为:
val functionName = {argument1: type -> return_value}
答案 1 :(得分:1)
我认为某些东西不能同时是一个Int和一个函数。也许在Int类上使用extention function?
operator fun Int.invoke(x: Int) = this + x
val a = 1(2)(3)
答案 2 :(得分:0)
Lionel Briand的好主意是在invoke
上创建运算符扩展函数Int
,您只需要另一个函数curry
作为入口点
operator fun Int.invoke(x: Int) = this + x
fun curry(x: Int) = x
您就可以做到自己想要的:
curry(1)(2)(3)(4) // will return 10