Kotlin:为什么我不能将函数存储在变量中?

时间:2018-12-15 19:43:42

标签: lambda kotlin functional-programming jvm

为什么必须使用函数引用将函数存储到变量中?

val someLambda: (Int) -> Unit = { i: Int -> println(i) }

但是我可以将lambda直接存储在变量中:

{{1}}

3 个答案:

答案 0 :(得分:4)

关于正确的语法。或更准确地说,是关于编译器了解您要告知的内容的能力!

查看不同的示例时,您会发现接受的案例使用特定的字符,例如冒号。这使得推断代码的意图变得更加容易。

因此,一个可能的原因可能是权衡。当然,当您拥有

val a = b

您可以允许b作为方法引用。但是,如果您想调用b()呢? b和b()之间的“词典”距离很小!

因此,不允许使用这种语法将使a)解析代码更容易,b)进行较小的拼写错误更难改变代码的含义!

答案 1 :(得分:2)

GhostCat's answer是非常正确的,但是它缺少要点,我认为应该提到这一点以使其完整。

可调用引用的语法在函数和属性之间是统一的,但是对于属性,绝对有必要将属性访问foo与可调用引用::foo区分开。

val foo: Int = TODO()
val fooValue = foo
val fooReference = ::foo

因此,尽管实际上函数可以仅使用函数名foo即可获得可调用的引用语法(无论如何,函数调用foo()都没有歧义),为了统一起见,函数与属性共享可调用引用语法::foo,而属性又需要某种特殊形式的可调用引用。

答案 2 :(得分:0)

因为尽管fun someFunction(i: Int): Unit = println(i)function,但它是一种更具体的类型,称为method,因此您需要方法引用语法。 Scala中也发生了similar

示例

fun method(value: String) = println(value)
val function: (String) -> Unit = { value -> println(value) }

val methodRef = ::method
val functionRef = function

进一步阅读“ Kotlin程序员词典”

相关问题