2011年5月18日 星期三

5-13. 「無括號 method」與「空括號 method」

Scala 的 method 宣告,雖然語法與 Java 不同,但精神 Java 的類似。
class S {
  def m1() = {...}
}

但 Scala 的 method 在處理無參數的 method 時,與 Java 有滿大的不同。

在 Scala 中,若 method 沒有參數,method 宣告時可以不包含小括號。但需要注意的是,沒有小括號與有小括號的 method 二者是不一樣的。

無括號的 method 稱為「無括號 method」,而有括號但無參數的 method,稱為「空括號 method」。

呼叫時,無括號的 method 需使用無括號的呼叫方式。而有括號的 method,可以使用有括號的呼叫方式,但由於小括號省略原則,也可以使用無括號的呼叫方式。

範例:「空括號 method」
可以使用有小括號的呼叫方式,或是無小括號的呼叫方式
class S {
  def m() = {....}
}
class Test {
  def test() = {
    val s = new S
    s.m() //使用有小括號的呼叫方式
    s.m //小括號省略原則,所以這是合法的
  }
}

範例:「無括號 method」
只可使用無小括號的呼叫方式
class S {
  def m = { //這裡是沒有小括號的 method
    ...
  }
}
class Test {
  def test() = {
    val s = new S
    s.m // 這是正常的 method 呼叫,並非使用小括號省略原則
    s.m() //由於 m 其實是無括號之 method,所以這種呼叫方式是錯誤的
  }
}
上例很清楚看到,無括號 method 不能使用有括號的呼叫方式。

雖然「無括號 method」與「空括號 method」,兩者被視為兩個不同的 method,但同名的這兩種 method,仍不能同時存在。
範例:同名的「無括號 method」與「空括號 method」,不可一起存在。
class S {
  def m() = .... // 空括號的 method
  def m = ... // 無括號 method
  }
}
上例,有兩個 method m,會有 compile error。

「何時使用空括號,何時使用無括號?」

在 Scala 中,「無括號 method」很常見,通常用在於直接 return 回一個 data field 的值。所以,無括號 method 通常不會有冗長的 code 以及 side effect。
相反的,空括號的 method,則與一般的 method 一樣,該 method 可以處理很多事,或是有 side effect。其與其他 method 的差異點,只在於它剛好沒有參數而已。

無論是「無括號 method」或「空括號 method」,由於小括號原則,我們都可以使用無括號的方式來呼叫。

「那何時使用有括號呼叫,何時使用無括號呼叫?」

與上述決定「何時宣告無括號 method」的通則一樣。當呼叫到一個複雜的 method,Scala 建議你使用空括號的呼叫。若你是呼叫一個無 side effect 的 method,這時建議你使用無括號的呼叫方式。

總之,不論是宣告,還是呼叫,無括號的 method,使用在無 side effect 時。而空括號的 method,使用在複雜或有 side effect 的情況下。

沒有留言:

張貼留言