我是scala的新手,在尝试学习匹配案例语法时,我想出了这段代码,第一个代码是我对其错误所做的,第二个是我如何修复它。有没有人知道为什么我需要在我的班级添加成员“名字”?
trait T
class A (name: String) extends T
case class B (cls: A)
object Main {
def main(args: Array[String]) {
val a: A = new A("John")
val b: B = new B(a)
checkType(b)
}
def checkType(cls: AnyRef) {
cls match {
case B(input) => println("your name is " + input.name)
case _ => println("others")
}
}
}
上面的代码给了我错误:“值名称不是A的成员”现在,如果我将类A更改为:
class A (n: String) extends T
{
var name: String = n
}
输出将是“你的名字是约翰”(这是我所期望的)
P.S:如果我将A级改为案例类,问题就解决了,为什么呢?
class A (name: String) extends T
没有val
或var
的参数是private [this]
类型,只在类中可见
如果你改成它
class A (val name: String) extends T
这使构造函数参数name
公开,并且可以使用类对象访问而无需getter(如果要更改值,请使用var
)
如果这个
case class A (name: String) extends T
case类参数默认为public val
,这就是为什么它如你所说的那样工作
参考 - https://docs.scala-lang.org/tour/classes.html https://docs.scala-lang.org/tour/case-classes.html