Разница между val и def в скале? - PullRequest
0 голосов
/ 20 октября 2019

Я начинаю со скалы, и у меня возникает путаница в оценке. Если в val результат оценивается при объявлении, то почему при вызове этого имени val он снова возвращает тело функции.

scala> val pop = (x:Int,y:Int)=> println(s"$x $y is the number")
pop: (Int, Int) => Unit = <function2>

scala> pop(12,3)
12 3 is the number

scala> pop(12,3) //So is this expression evaluated again ? and if not how is it stored in the memory that if 12 and 3 will come as parameter then that value will be given back.
12 3 is the number
scala> pop
res6: (Int, Int) => Unit = <function2>
//why is it giving the body as it is already evaluated

Может ли быть объявлена ​​функция без параметров, использующая val?

val som....which only prints say hello

1 Ответ

3 голосов
/ 20 октября 2019

В Scala функции - это первоклассные значения , поэтому значение из pop само по себе

(x:Int, y:Int) => println(s"$x $y is the number")

. Такое значение функции может сильно отличаться от, скажем, значения 42, но тем не менее является обычным значением. Например, противопоставьте следующее

val i: Int = 42                   // assigning value 42 to name i
val f: Int => String = i => "foo" // assigning value `i => "foo"` to name f

. Это может стать более понятным, если мы десугар pop определение до

val pop: Function2[Int, Int, Unit] = new Function2[Int, Int, Unit] {
  def apply(x: Int, y: Int): Unit = println(s"$x $y is the number")
}

, где мы видим, что pop назначен экземпляр Function2класс, который содержит метод apply. Более того, pop(12, 3) обращается к

pop.apply(12,3)

, где мы видим, что pop(12, 3) просто вызывает метод класса Function2. Сравните оценку из pop

pop
res6: (Int, Int) => Unit = <function2>

с функцией применение экземпляра функции pop указывает на

pop(12,3)
12 3 is the number

pop - это определение val ue в том смысле, что мы не можем изменить функцию, на которую оно указывает, например,

pop = (i: Int) => i.toString // error: reassignment to val

Функция без параметров может быть определена следующим образом:

val g = () => "I am function with no parameters"
g   // evaluates g
g() // applies function pointed to by g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...