2014-02-22 129 views
1

我有一个Scala的类定义如下:理解构造斯卡拉

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

现在,从来就没有在班上存储该通过门变量的类中的任何线,但这些方法使用它。所以可以有一个方法,如:

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

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

回答

5

你的那部分代码:

class Node(factor: Factor, gate: Gate) 

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

你的这部分代码:

extends GenericNode(factor) 

说,随着节点的主构造收到factor值从GenericNode和的GenericNode(超)构造Node继承将被称为

+2

对不具有'val'关键字的非'case'类的主要构造函数参数只有在构造函数代码之外被引用时才会复制到私有字段中(例如,如果它们是从方法体中引用的或者在'lazy val'初始化表达式中)。 –

+2

'case class'构造函数参数在默认情况下是公共的,所以不需要用val来预先设置它们。 –

+0

谢谢你的解释! – Luca

2

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

对于案例类,编译器还使用apply和unapply方法生成伴随对象(与该类名称相同的对象),其中第一个可用于构造类的新实例,而第第二个用于对类的实例执行模式匹配。你也应该看看这个blog post以获得对案例类的很好的描述。

+0

“构造函数参数只能在默认构造函数(类的主体)中访问”不,它们也可以在类的任何成员中访问。 –

+0

你是完全正确的,我已经编辑了相应的答案 – csgero