В следующем операторе 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)?