簡體   English   中英

使用初始化塊進行對象初始化

[英]Object Initialization with an initializer block

昨天我正在閱讀一篇名為: Scala Experience如何改進我們的Java開發的論文

在對象初始化部分,它說:

用於實例化對象的慣用Scala技術(不通過構造函數參數公開所有相關參數)是創建一個帶有初始化塊的匿名子類,該塊調用其他語句[Odersky et al。]:

我一直在做一些測試:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM