В следующем операторе val f
определяется как лямбда, которая ссылается сама на себя (это рекурсия):
val f: Int => Int = (a: Int) =>
if (a > 10) 3 else f(a + 1) + 1 // just some simple function
Я пробовал его в REPL, и он правильно компилируется и выполняется.
Согласно спецификации, это похоже на незаконную прямую ссылку:
В последовательности операторов
s[1]...s[n]
, составляющих блок, если простое имя вs[i]
относится к объекту, определенномуs[j]
, гдеj >= i
, то для всехs[k]
междуs[i]
иs[j]
включительно,
s[k]
не может быть определением переменной.- Если
s[k]
является определением значения, оно должно бытьlazy
.
Присваивание представляет собой один оператор, поэтому оно удовлетворяет критериям j >= i
и включено в интервал операторов, к которым применяются два правила (между s[i]
и s[j]
включительно).
Однако похоже, что это нарушает второе правило, потому что f
не ленится.
Как это юридическое утверждение (пробовал в Scala 2.9.2)?