我有一个Scala类定义如下:
case class Node(factor: Factor, gate: Gate) extends GenericNode(factor)
现在,类中从来没有任何行在类中存储此传递的Gate变量,但方法使用它。所以可以有一个方法:
def compute(): factor
val p = gate.getParam()
我来自C ++背景,所以这对我来说是新的。那么,在类定义中传递的所有变量在对象实例的生命周期中都有范围,还是会自动复制?
答案 0 :(得分:5)
你的代码部分:
class Node(factor: Factor, gate: Gate)
使用2个类参数声明一个类Node
。这意味着您自动获得一个构造函数(称为主构造函数),该构造函数接受2个变量作为输入,自动将它们复制为私有类成员。您可以稍后通过this.factor
和this.gate
在课程中访问这些内容。如果您已将它们声明为val
,则它们也可以自动从班级外部访问。
这部分代码:
extends GenericNode(factor)
表示Node
继承自GenericNode
,并且GenericNode
(超类)的构造函数将在Node的主要构造函数中以factor
接收的值进行调用/ p>
答案 1 :(得分:2)
case class
是scala中特殊类型的类,提供了一些标准类的便利功能。其中一个功能是使所有构造函数参数在类的实例上公开可见。对于普通的“非大小写”类,它的工作方式不同,那里的构造函数参数只能在类中访问(像只读私有字段一样工作),除非它们以val
或{{1}为前缀关键字。
对于case类,编译器还生成一个伴随对象(一个与该类同名的对象),带有apply和unapply方法,其中第一个可用于构造类的新实例,而第二个用于在类的实例上执行模式匹配。您还应该查看此blog post以获得案例类的详细说明。