使用初始化块进行对象初始化

时间:2011-11-06 13:47:50

标签: scala

昨天我正在阅读一篇名为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" }
                      ^

2 个答案:

答案 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"