2012-10-14 74 views
2

可能重複:
Why to use empty parentheses in Scala if we can just use no parentheses to define a function which does not need any arguments?這兩個方法定義有什麼區別?

考慮我們有一個類Foo與方法bar(其中不帶任何參數和返回字符串"bar")。有落實巴兩種方式

第一個是

class Foo { 
    def bar() = "bar" 
} 

第二個是

class Foo { 
    def bar = "bar" 
} 

雖然都這樣做基本上是相同的,他們需要不同的調用,第一個這樣

someFoo.bar() 

,第二個

someFoo.bar 

爲什麼我應該使用其中一種,而根本區別是什麼?

+2

我認爲這是帶scala標籤的最常見問題之一,我看到它:) – 4e6

+0

*它們需要以不同的方式調用*實際上,沒有任何東西可以阻止您調用方法定義的帶括號的括號:'def foo(){}; foo'(但不是反之亦然) –

回答

1

定義一個沒有括號沒有括號的方法意味着該方法是(它沒有副作用,並且不依賴於程序的狀態)。這樣的方法可以稱爲不帶括號:

class Square(val side: Int) { 
    def area = side * side 
} 

s = new Square(10); 
s.area //ok 
s.area() //compilation error 

調用一個方法,而不帶括號的參數意味着,該方法有一定的副作用和Unit返回類型。用空括號定義的方法可以在有或沒有它們的情況下調用。

class Foo { 
    def bar(): Unit = println("bar") 
} 

f = new Foo(); 
f.bar; //ok, bad style 
f.bar(); // good 
+0

難道你不是指「定義」而不是「調用」? – Ixx

1
  1. 他們都不需要用括號中被調用。然而def bar = "bar"需要被調用沒有禁忌,因爲隱含的暗示將被應用於它的結果,因此在這種情況下調用bar()將具有與"bar"()相同的效果。

  2. 這只是一個約定的問題。在我的練習中,我見過兩種:

    • 標準(用於標準庫和大多數第三方)。當方法不產生副作用時,放棄偏愛。是「純粹的」,即除了不會造成任何副作用也不依賴於狀態,然而這不是一個要求。根據這個慣例,你的第二個例子將是正確的。
    • 斯卡拉斯。每當方法沒有參數時就放棄缺口,即該方法可能產生副作用。例如,他們皮條客一個方法print沒有括號。

Bozhidar提出的另一次會議,但是,說實話,這是我第一次接觸到它。