何时需要在 Scala 中向我的类添加成员定义



>我对 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

不带 valvar 的参数属于 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

最新更新