使用初始化块初始化对象
问题描述:
昨天我正在阅读一篇名为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" }
^
答
这已经没有多少做初始化剂块。这只是在制糖语法
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
}
答
的“操作符号”需要明确的接收器。例如:
print("hello");
的工作,但:
print "hello"
不会。
同样,这将工作,并打印"hello"
Predef print "hello"