Scala: параметры по имени
Сегодня встретился с интересным кодом на Scala:
Подумал, что какие-то недалекие люди такое писали. Ведь всем известно, что
log.isDegubEnabled
Вызывается для того, чтобы умный JIT компилятор увидел, что это выражение всегда false
и выпилил вызов
log.debug(msg)
И мы бы сэкономили кучу ресурсов на формировании сложного msg
.
Оказалось это я дурак и Scala поддерживает параметры по имени, о чем нам говорит =>
перед типом.
И тогда значение параметра вычисляется не в момент вызова функции, а в момент использования.
Это позволяет не только экономить ресурсы при выключенном дебаге, но и делать еще некоторые трюки, например реализовать функцию notIf
, которая вычисляет значение выражение только если условие выполняется.
В Java такого нет, а в Clojure такое можно было бы реализовать с помощью макросов.