¿Por qué Kotlin necesita una syntax de reference de function?

Los documentos de Kotlin declararon que admite funciones de order superior . ¿Por qué el lenguaje incluso necesita una syntax de ::function cuando pasa una function de nivel superior como argumento?

Dado:

 fun isOdd(x: Int) = x % 2 != 0 val numbers = listOf(1, 2, 3) println(numbers.filter(::isOdd)) // here. 

¿Por qué no solo

 fun isOdd(x: Int) = x % 2 != 0 val numbers = listOf(1, 2, 3) println(numbers.filter(isOdd)) // simple and makes more sense 

Más sobre la syntax de reference de funciones aquí .

Solutions Collecting From Web of "¿Por qué Kotlin necesita una syntax de reference de function?"

El layout del lenguaje Kotlin intenta evitar situaciones ambiguas en las que la ausencia de algo pueda ser syntax correcta e incorrecta al mismo time. Por ejemplo, si permitiste la syntax propuesta:

 isOdd // error, function invocation expected isOdd(...) isOdd // not error, you have a function reference 

The :: es una señal clara en cuanto a la intención. Debido a esto, solo obtiene un error en el caso de isOdd porque ahora tiene posibilidades que no se superponen:

 isOdd // error, function invocation expected isOdd(...) ::isOdd // function reference isOdd() // error, missing parameter x isOdd(x) // function call 

Es por eso que Kotlin evita cosas que conducen a estados ambiguos. Tus ojos también pueden detectar el problema rápidamente, al igual que el IDE y el análisis estático, tal como lo hace el comstackdor. Si comienza a permitir esta syntax más suelta, comenzará a encontrarse con ambigüedades compuestas, como cuando se usa como funciones de infijo, etc. El layout del lenguaje es más complicado que "oh, hagamos que escriban less caracteres" porque la matriz de complejidad es mucho más grande de lo que imaginas si solo observas un caso de uso ignorando a todos los demás.

Por qué la respuesta aceptada arriba es incorrecta:

La respuesta aceptada actualmente dice que este es un problema de espacio de nombres, eso no es correcto. En esa muestra usan:

 val isOdd : (Int) -> Boolean = { x -> x % 2 != 0 } 

Y afirma que funciona sin el :: debido al espacio de nombres. En realidad, funciona porque esto ya es una reference de function y se declaró como una reference de function y, por lo tanto, no necesita un operador para convertirlo en una reference de function . Sin embargo, la function no es una reference. Es una function. Necesita un operador :: para convertirlo en una reference a la function que es lo que se requiere al usarlo como un pnetworkingicado para el método de filter .

El reclamo en esa respuesta es engañoso y falso.

Debido a que Java (y, por lo tanto, Kotlin) usa espacios de nombres separados para campos y methods, necesita :: para evitar ambigüedades. Ejemplo:

 val isOdd : (Int) -> Boolean = { x -> x % 2 != 0 } fun isOdd(x: Int): Boolean { return x % 2 != 0 } val odds = listOf(1,2,3).filter(isOdd) // uses the val version val otherOdds = listOf(1,2,3).filter(::isOdd) // uses the fun version