为什么必须使用函数引用将函数存储到变量中?
val someLambda: (Int) -> Unit = { i: Int -> println(i) }
但是我可以将lambda直接存储在变量中:
{{1}}
答案 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程序员词典”