究竟是什麼區別:當我使用def定義Scala中的字段時,這意味着什麼?
scala> def foo = 5
foo: Int
和
scala> def foo() = 5
foo:()Int
看來,在這兩種情況下,我結束了一個變量foo
,我可以指沒有括號,一直在評估對5
。
究竟是什麼區別:當我使用def定義Scala中的字段時,這意味着什麼?
scala> def foo = 5
foo: Int
和
scala> def foo() = 5
foo:()Int
看來,在這兩種情況下,我結束了一個變量foo
,我可以指沒有括號,一直在評估對5
。
你不會在任何情況下定義一個變量。你正在定義一個方法。第一種方法沒有參數列表,第二種方法有一個參數列表,它是空的。其中第一個應該被稱爲像這樣
val x = foo
而第二個應該被稱爲像這樣
val x = foo()
然而,Scala編譯器將讓你調用一個空參數列表方法不使用括號,所以任何形式的呼叫都可以用於第二種方法。不帶參數列表的方法不能用圓括號調用
首選的Scala樣式是定義和調用帶圓括號的副作用的無參數方法。沒有副作用的沒有參數的方法應該被定義並且在沒有括號的情況下被調用。
如果你真的要定義一個變量,語法是
val foo = 5
是什麼意思,當我使用高清斯卡拉
來定義一個字段,則不能定義使用def
的字段。
看來,在這兩種情況下,我結束了一個變量foo的,我可以指沒有括號,總爲5
不,在你結束了一個方法,這兩種情況foo
,你可以在沒有括號的情況下打電話。
一看就知道,你可以使用javap
:
// Main.scala
object Main {
def foo1 = 5
def foo2() = 5
}
F:\MyProgramming\raw>scalac main.scala
F:\MyProgramming\raw>javap Main
Compiled from "main.scala"
public final class Main extends java.lang.Object{
public static final int foo2();
public static final int foo1();
}
然而,看到http://tommy.chheng.com/index.php/2010/03/when-to-call-methods-with-or-without-parentheses-in-scala/
之前別的說,def
沒有定義一個字段,它定義了一個方法。
在第二種情況下,可以省略括號,因爲Scala的特定功能。這裏有兩個不同的興趣點:一個是機械的,另一個是推薦的用法。
從後者開始,建議在有副作用時使用空參數列表。一個典型的例子是close()
。如果調用元素沒有副作用,則會省略括號。
現在,作爲一種實際的區別 - 超出了可能出現在角落案例中的奇怪句法混淆(我不是說有,只是猜測) - 結構類型必須遵循正確的約定。
例如,Source
有close
方法沒有括號,意思是結構類型的def close(): Unit
不會接受Source
。同樣,如果我將結構方法定義爲def close: Unit
,則不會接受Java closeable
對象。
而且已經給予我想強調兩點答案:
的可能性來定義不帶參數列表的方法是實現Uniform Access Principle的方式。這允許隱藏字段和方法之間的差異,這使得稍後的實現更改更加容易。
可以調用的方法定義爲使用foo
def foo() = 5
,但你不能調用的方法使用foo()
實際上定義爲
def foo = 5
,斯卡拉會讓你的Elid任意數量的(後)空參數列表!試試'def x()()()()()()()= 5'! – 2010-08-16 17:51:46