متدی که با val تعریف می شود در زمان تعریف evaluate می شود.
متدی که با def تعریف می شود در هر بار فراخوانی evaluate می شود. به عبارت دیگر در هر بار فراخوانی متدی که با def تعریف می شود یک instance جدید از Function1 ساخته و فراخوانی می شود.
val test: () => Int = {
val r = util.Random.nextInt
() => r
}
test()
// Int = -1049057402
test()
// Int = -1049057402 - same result
def test: () => Int = {
val r = util.Random.nextInt
() => r
}
test()
// Int = -240885810
test()
// Int = -1002157461 - new result