x
не инициализируется до оценки new Cons(1, x)
, что означает, что до этого момента оно имеет значение null
, однако x
само по себе является аргументом для конструктора Cons
. Если параметр объявлен по значению, то он оценивается до того, как передается. В этом случае new Cons(1, x)
становится new Cons(1, null)
, что не то, что мы хотим. Вместо этого мы можем объявить параметр как по имени , используя запись =>
, чтобы задержать оценку аргумента. Теперь new Cons(1, x)
становится чем-то вроде
new Cons(1, () => x))
Это дает val x
возможность правильно инициализироваться перед использованием.
По имени:
class Cons(elem: Int, next: => Cons) {
def n = next
}
val x: Cons = new Cons(1, x)
x.n
// res0: Cons = Cons@f523e05
По стоимости
class Cons(elem: Int, next: Cons) {
def n = next
}
val x: Cons = new Cons(1, x)
x.n
// res0: Cons = null