Function 为什么有两个函数做完全相同的事情?为什么在Kotlin中必须以不同的方式调用?

Function 为什么有两个函数做完全相同的事情?为什么在Kotlin中必须以不同的方式调用?,function,kotlin,kotlin-function-type,Function,Kotlin,Kotlin Function Type,我怎么能用相同的名称声明两个evenfn(一个存储在变量中,另一个刚刚定义)并且我必须以不同的方式调用它们?在JavaScript中,这样做会抛出一个错误,表明已经存在一个evenFn 有人能解释一下为什么编译器对这两个事件处理不同吗?在Javascript中这样做不会引发错误。在Javascript中,函数被提升到作用域的顶部 如果您要编写如下代码: var test=function(){ console.log('a'); } 功能测试(){ console.log('b'); } te

我怎么能用相同的名称声明两个
evenfn
(一个存储在变量中,另一个刚刚定义)并且我必须以不同的方式调用它们?在JavaScript中,这样做会抛出一个错误,表明已经存在一个
evenFn


有人能解释一下为什么编译器对这两个
事件处理不同吗?

在Javascript中这样做不会引发错误。在Javascript中,函数被提升到作用域的顶部

如果您要编写如下代码:

var test=function(){
console.log('a');
}
功能测试(){
console.log('b');
}
test();

test.apply()在阅读kotlin文档的函数类型部分后,我找到了答案。您需要对本地函数、成员函数的可调用引用,以便将它们作为引用传递。

fn
是一种方法
val evenFn
是一个局部变量,恰好具有函数类型。在Kotlin(以及Java和C#等)中,允许在作用域中具有相同名称的方法和局部变量,并且局部变量的类型不影响这些规则。

,实际上会引发错误,因此您需要在第一条语句中删除var声明,因为您希望重新分配它,而不是重新声明它
fun main() {
    fun evenFn(num: Int): Boolean {
        return num % 2 == 0
    }
    val evenFn = fun(num: Int) = num % 2 == 0
    val list = listOf(1, 2, 3, 4, 5, 6)
    println(list.filter(evenFn))
    println(list.filter { evenFn(it) })
}