Различия между этими тремя способами определения функции в Scala

Учитывая три способа выражения одной и той же функции f(a) := a + 1 :

 val f1 = (a:Int) => a + 1 def f2 = (a:Int) => a + 1 def f3:(Int => Int) = a => a + 1 

Как эти определения отличаются? REPL не указывает на очевидные различия:

 scala> f1 res38: (Int) => Int =  scala> f2 res39: (Int) => Int =  scala> f3 res40: (Int) => Int =  

f1 – это функция, которая принимает целое число и возвращает целое число.

f2 – метод с нулевой активностью, который возвращает функцию, которая принимает целое число и возвращает целое число. (Когда вы f2 на REPL позже, он становится вызовом метода f2 .)

f3 совпадает с f2 . Вы просто не используете там вывод типа.

Внутри classа val оценивается при инициализации, а def оценивается только тогда, когда и каждый раз вызывается функция. В приведенном ниже коде вы увидите, что x оценивается при первом использовании объекта, но не снова при доступе к члену x. Напротив, y не оценивается, когда объект создается, но оценивается каждый раз, когда к нему обращаются.

  class A(a: Int) { val x = { println("x is set to something"); a } def y = { println("y is set to something"); a } } // Prints: x is set to something val a = new A(1) // Prints: "1" println(ax) // Prints: "1" println(ax) // Prints: "y is set to something" and "1" println(ay) // Prints: "y is set to something" and "1" println(ay) 

Выполнение определения, такого как def x = e, не будет оценивать выражение e . Вместо этого e оценивается всякий раз, когда используется x . В качестве альтернативы, Scala предлагает определение значения val x = e, которое оценивает правое поле e как часть оценки определения. Если впоследствии используется x , оно немедленно заменяется предварительно вычисленным значением e , так что выражение не нужно снова оценивать.

Скала по примеру Мартина Одерского

  • Разница между этим и «я» в аннотациях самостоятельного типа?
  • Функции против методов в Scala
  • Как работает тип Dynamic и как его использовать?
  • В чем разница между «def» и «val» для определения функции
  • Как добавить переменную в Scala?
  • Отладка Scala-кода с помощью простого-build-инструмента (sbt) и IntelliJ
  • Что означает => и () => среднее значение в Scala
  • Использование def, val и var в scala
  • Подчеркивание в именованных аргументах
  • Почему объектные объекты более объектно-ориентированные?
  • частный против частного
  • Давайте будем гением компьютера.