2015-04-19 75 views
0

閱讀Value Classes and Universal Traits後,我看了RichInt的例子。Value Class w /`val`字段

但是,我更改了self字段以取消val

scala> class RichInt(self: Int) extends AnyVal { 
    | def toHexString: String = java.lang.Integer.toHexString(self) 
    | } 
<console>:7: error: value class parameter must be a val and not be private[this] 
     class RichInt(self: Int) extends AnyVal { 
        ^

我得到了編譯時錯誤。看來,在該字段中省略val結果的可訪問性爲private[this]

保持與排除val有什麼意義?我不確定must be a val究竟意味着什麼。

+1

這個話題似乎是相似的http://stackoverflow.com/questions/17944356/value-classes-introduce-unwanted-public-methods –

回答

3

也許措詞必須是val是有點關閉。更具體地說,價值分類參數必須是公開價值,正如該文章中所述。

值類...

...必須只與恰好一個公共的主要構造,VAL參數其類型是不是值類。

聲明class RichInt(val self: Int) extends AnyVal,意味着self一個公共的訪問將編譯器爲RichInt類創建。如果您從構造函數中刪除val聲明,那麼self將在該類的實例中爲私有(並且只能由this實例訪問)。

+0

它也說*(從斯卡拉2.11.0,該參數可能是非 - 公共。)*,但在2.11中似乎不起作用。 –

+0

'class RichInt(private val self:Int)extends AnyVal {}'適用於我,使用2.11.6 – Marth

+0

啊,我想這就是它不能是'private [this]'。 –