Усередині класу 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(a.x)
// Prints: "1"
println(a.x)
// Prints: "y is set to something" and "1"
println(a.y)
// Prints: "y is set to something" and "1"
println(a.y)
f1
в REPL показує значення, статично прив’язане підf1
час оцінки,f2
іf3
показує результат виклику цих методів. Зокрема, новийFunction1[Int, Int]
екземпляр створюється кожного разу,f2
або колиf3
він викликається, алеf1
залишається незміннимFunction1[Int, Int]
назавжди.