我什么时候需要在scala中向我的类中添加成员定义?

问题描述 投票:0回答:1

我是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级改为案例类,问题就解决了,为什么呢?

scala syntax
1个回答
0
投票
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

case类参数默认为public val,这就是为什么它如你所说的那样工作

参考 - https://docs.scala-lang.org/tour/classes.html https://docs.scala-lang.org/tour/case-classes.html

© www.soinside.com 2019 - 2024. All rights reserved.