昨天我正在阅读一篇名为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" }
^
答案 0 :(得分: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
}
答案 1 :(得分:4)
“操作符号”需要明确的接收者。例如:
print("hello");
会工作,但是:
print "hello"
不会。
此将再次工作,并打印"hello"
Predef print "hello"