Каква е разликата между 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). Защо само първото се проваля?


person amaya    schedule 09.06.2014    source източник
comment
Този проблем няма нищо общо с Stream.   -  person wingedsubmariner    schedule 09.06.2014


Отговори (1)


Параметрите на конструктора на клас case се превръщат автоматично в достъпни полета. Например вашият клас B има x като поле и така B.x е законно. Вашият клас A не е клас case и затова неговият x не е превърнат в достъпно поле. Ако искате не-case клас да има своите параметри на конструктора достъпни, те трябва да бъдат изрично маркирани с val:

class A(val x: Int)
person wingedsubmariner    schedule 09.06.2014