>我对 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
}
输出将是"你的名字是约翰"(这是我所期望的(
PS:如果我将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
默认情况下,案例类参数是公共val
,所以这就是为什么它像你说的那样工作
参考-
https://docs.scala-lang.org/tour/classes.htmlhttps://docs.scala-lang.org/tour/case-classes.html