2011-11-06 111 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"