了解Scala中的构造函数

时间:2014-02-22 14:42:03

标签: scala

我有一个Scala类定义如下:

case class Node(factor: Factor, gate: Gate) extends GenericNode(factor)

现在,类中从来没有任何行在类中存储此传递的Gate变量,但方法使用它。所以可以有一个方法:

def compute(): factor
    val p = gate.getParam()

我来自C ++背景,所以这对我来说是新的。那么,在类定义中传递的所有变量在对象实例的生命周期中都有范围,还是会自动复制?

2 个答案:

答案 0 :(得分:5)

你的代码部分:

class Node(factor: Factor, gate: Gate)

使用2个类参数声明一个类Node。这意味着您自动获得一个构造函数(称为主构造函数),该构造函数接受2个变量作为输入,自动将它们复制为私有类成员。您可以稍后通过this.factorthis.gate在课程中访问这些内容。如果您已将它们声明为val,则它们也可以自动从班级外部访问。

这部分代码:

extends GenericNode(factor)

表示Node继承自GenericNode,并且GenericNode(超类)的构造函数将在Node的主要构造函数中以factor接收的值进行调用/ p>

答案 1 :(得分:2)

case class是scala中特殊类型的类,提供了一些标准类的便利功能。其中一个功能是使所有构造函数参数在类的实例上公开可见。对于普通的“非大小写”类,它的工作方式不同,那里的构造函数参数只能在类中访问(像只读私有字段一样工作),除非它们以val或{{1}为前缀关键字。

对于case类,编译器还生成一个伴随对象(一个与该类同名的对象),带有apply和unapply方法,其中第一个可用于构造类的新实例,而第二个用于在类的实例上执行模式匹配。您还应该查看此blog post以获得案例类的详细说明。