Это может быть ясно из результатов дизассемблера класса File, используя javap
. Сохраните следующий код в Test.scala
class Test {
val fVal: Int => Int = x => x + 1
var fVar: Int => Int = x => x + 1
def fDef(x: Int): Int = { x + 1 }
}
и сделать scalac Test.scala; javap Test
покажет
Compiled from "Test.scala"
public class Test {
public scala.Function1<java.lang.Object, java.lang.Object> fVal();
public scala.Function1<java.lang.Object, java.lang.Object> fVar();
public void fVar_$eq(scala.Function1<java.lang.Object, java.lang.Object>);
public int fDef(int);
public Test();
}
Как показали результаты выше, val
и fVar
представлены как методы, которые возвращают объект Function1. Разница в fVar
имеет дополнительный «сеттер». Хотя fDef
похож на обычный Java-метод.
Возможный дубликат [Практическое различие между def f (x: Int) = x + 1 и val f = (x: Int) => x + 1 в Scala] (http://stackoverflow.com/questions/22354396/practice-difference-between-def-fx-int-x1-and-val-fx-int-x1-in) –
Это не имеет ничего общего с функциями. Разница между 'var',' val' и 'def' не имеет ничего общего с их типом. 'var' и' val' - это поля («переменные», если вы это сделаете), 'def' - это метод.Неважно, что они возвращают. –