Под капотом есть другие различия между функциями и методами.Обычно простой метод генерирует меньше накладных расходов, чем функция (технически это объект с методом apply
).
Однако, если вы попытаетесь не заботиться об этих различиях и подумаете о def
, val
и var
как поля с различной семантикой, тогда просто def
оценивает каждый раз, когда вызывается, в то время как val
оценивает только один раз.* должен вызвать isDivisibleBy(2)
во время его определения и присвоить результат isDivisibleBy(2)
.Например, он заменяет k
в
def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0
на 2
и присваивает результат конечного выражения (в данном случае есть только одно выражение):
val isEven: Int => Boolean = i => i % 2 == 0
*С другой стороны, 1024 * не выполняет такую оценку и каждый раз приводит к вызову isDivisibleBy (2).
Это означает, что позже, когда вы выполните код, isEven(11)
генерируется в случае val
11 % 2 == 0
, а в случае def
у вас будет
isDivisibleBy(2)(11)
, и только после оценки isDivisibleBy
вы получите результат.
Вы можете добавить отладочный код к isDivisibleBy
, чтобы увидеть разницу:
def isDivisibleBy(k: Int): Int => Boolean = {
println("evaluating isDivisibleBy")
i => i % k == 0
}