В чем разница между "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)
Другие вопросы по тегам