2014-02-22 128 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