2015-04-19 46 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]'。 –