Усередині класу 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]назавжди.