【发布时间】:2017-12-22 00:14:29
【问题描述】:
我可以在括号外写一个 lambda 表达式,但我不能按名称把它放在那里。我尝试了很多方法:
val plus3: (Int,Int,Int)->Int = {a,b,c->a+b+c}
println(apply3(1,2,3){a,b,c->a+b+c}) // OK
println(apply3(1,2,3){plus3}) // Type mismatch. Required: Int, Found: (Int,Int,Int)->Int
println(apply3(1,2,3){(plus3)}) // Type mismatch. Required: Int, Found: (Int,Int,Int)->Int
println(apply3(1,2,3)plus3) // unresolved reference
println(apply3(1,2,3){plus3()}) // value captured in a closure
println(apply3(1,2,3){(plus3)()}) // value captured in a closure
把名字放在那里(括号外)的语法是什么?
我不知道为什么,但是在documentation 中没有关于主题的词。它说我们可以把 lambda 放在那里,但没有一个关于表示该 lambda 的变量或常量的词。
【问题讨论】:
-
那是因为你不能。那是因为没有理由:/
-
@OliverCharlesworth 替换是最基本的逻辑规则。名称理论高于逻辑。如果它被破坏,则应解释该案例并由更具体的规则涵盖。对话“为什么? - 因为!”即使是儿童游戏也不有趣。
-
答案中已经解释过文档说您需要提供 lambda 表达式,因此没有歧义。我也给了你一个理由——没有令人信服的理由允许这样做。你还需要什么?
-
@OliverCharlesworth 我需要为一个项目选择语言。我认为 Kotlin 是一个伪装者。但正如我所见,Java 或 Groovy 函数式编程更加一致。没有任何客观原因的禁止会导致错误和误解。
-
@Gangnus 如果这是您的担忧,Java 肯定也不例外。例如。 “如果 lambda 表达式出现在程序中的赋值上下文(第 5.2 节)、调用上下文(第 5.3 节)或强制转换上下文(第 5.5 节)之外的某个地方,则这是一个编译时错误。”在docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27。
plus3之类的变量在其他上下文中也有效。
标签: intellij-idea lambda functional-programming kotlin