2011-11-06 213 views
1

昨天我正在閱讀一篇名爲How Scala Experience Improved Our Java Development的論文。使用初始化塊初始化對象

裏面的對象初始化部分,它說:

慣用的Scala技術爲實例化對象(它 不暴露通過構造函數參數所有相關參數)是 創建一個匿名子類有一個初始化塊這就要求 附加聲明[Odersky的等人]:

我一直在做一些測試:

class B { 
    var x1: String = "B" 

    def setText(text: String) { 
    x1 = text 
    } 

    override def toString = x1 
} 

我真的不明白,爲什麼我可以這樣做:

scala> new B{setText("new Text")} 
res23: B = new Text 

,但我不能這樣做:

scala> new B{ setText "new Text" } 
<console>:1: error: ';' expected but string literal found. 
     new B{ setText "new Text" } 
        ^

回答

11

這已經沒有多少做初始化劑塊。這只是在製糖語法

a b 

意味着

a.b 

,而不是

a(b) 

或者在一般情況下

obj meth arg 

是糖

obj.meth(arg) 

arg是可選的。

如果你想不使用括號來指定這個,你就會有方法之前寫的接收對象:

new B { this setText "new Text" } 

如果出於某種原因,你要保存的字符,你可以添加一個自我型別名:

new B { o => 
    o setText "new Text" 
    o setTitle "a Title" 
    o setSomeOtherArgument someArg 
} 
4

的「操作符號」需要明確的接收器。例如:

print("hello"); 

的工作,但:

print "hello" 

不會。

同樣,這工作,並打印"hello"

Predef print "hello"