Почему есть две функции, которые делают одно и то же? Почему в Kotlin нужно ссылаться по-другому? - PullRequest
3 голосов
/ 11 апреля 2019
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) })
}

Как получается, что я могу объявить два evenFns с одним и тем же именем (один хранится в переменной, а другой только что определен), и мне приходится вызывать их по-разному? В JavaScript это может привести к ошибке, говорящей о том, что evenFn.

уже существует.

Может кто-нибудь объяснить, почему два evenFns трактуются компилятором по-разному?

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

fun evenFn - метод; val evenFn - это локальная переменная с типом функции. В Kotlin (и Java, и в C #, и т. Д.) Разрешено иметь метод и локальную переменную с тем же именем в области видимости, и тип локальной переменной не влияет на эти правила.

0 голосов
/ 11 апреля 2019

Я понял это, прочитав раздел «Типы функций» документации kotlin.Вам нужна вызываемая ссылка на локальные функции, функции-члены, чтобы передавать их как ссылки.

0 голосов
/ 11 апреля 2019

Выполнение этого в Javascript не приведет к ошибке. В Javascript функции поднимаются наверх области видимости.

Если бы вы написали такой код, как

var test = function() { 
    console.log('a');
}

function test() {
    console.log('b');
}

test();
test.apply();

второе определение функции будет поднято наверх, чтобы создать код, который читается как

var test = function() { console.log('b'); }
var test = function() { console.log('a'); }

Как видите, определение функции перезаписывается определением переменной. Выход будет поэтому

a
a
...