В чем разница между "class" и "case class" в Stream в Scala?
class A(x: Int)
def f(a: A): Stream[A] = a #:: f(new A(a.x + 1))
case class B(x: Int)
def f(b: B): Stream[B] = b #:: f(B(b.x + 1))
Я ожидал, что эти два случая сделают то же самое. Но первое не удалось с ошибкой (значение x не является членом A). Почему проваливается только первое?
1 ответ
Решение
Класс case имеет параметры конструктора, автоматически превращаемые в доступные поля. Например, ваш класс B
имеет x
как поле и так B.x
законно Твой класс A
это не класс дела и поэтому его x
не был превращен в доступное поле. Если вы хотите, чтобы не-case класс имел свои параметры конструктора доступными, они должны быть явно помечены как val
:
class A(val x: Int)