2014-09-05 53 views
0

嗨,我正在學習Scala語言並且有一個問題。我正在讀一本書,其中一個例子說0到2和(0)。到(2)是一樣的。我怎樣才能解釋這個語法?我的意思是,我可以看到這是一個以一個整數值爲參數的函數。但什麼是「(0)」。部分??謝謝在scala中調用函數的語法

回答

5

在scala中,任何採用單個參數的方法都可以用中綴語法編寫。

因此,舉例來說,如果你有

class Foo(x: Int) { 
    def add(y: Int) = x + y 
} 
val a = new Foo(42) 

那麼這兩個方法調用是完全等價的

a.add(4) // 46 
a add 4 // 46 

之所以還有的0圍繞一個括號的是,在舊版本斯卡拉0.的由於.(它既可以是小數點分隔符又可以是方法選擇器)的模糊值,可能會被解釋爲浮點數。由於斯卡拉2.11(或2.10,我不記得了),這已得到修復,所以你現在可以安全地輸入

0.+(2) // Int: 2 

,並得到一個Int回來,而你將不得不在過去Float,如編譯器會看到它作爲

0.0 + (2) // Float: 2 
+0

此外,整數和其他原始類型被自動轉換爲等效的對象類型。值「0」是一個整數,並自動轉換爲「Int」。 'Int'有一個方法'to()',它接受一個整數參數。 – 2014-09-05 23:21:59

+0

@Bob,這是另一種方式。 'Int'是一個對象類型,然後在底層JVM中用一個原語表示。在2.10中棄用 – 2014-09-05 23:25:54

+0

,在2.11中新的行爲。差異在'val i = 0;'以前是雙重的,但現在是錯誤。 – 2014-09-06 02:06:18

0

我的意思是,我可以看到,to是一個函數,它接受一個整數值作爲參數。

不,它不是一個函數,它是一種方法。

的方法是通過將消息發送到一個對象調用:

foo.bar(baz) 

這意味着「與由baz引用作爲參數由foo引用的對象的對象發送消息bar這將反過來導致方法barfoo的類或其祖先之一要被調用。

所以,to是消息,2爲參數,並0是理論值的接收器電子郵件。

斯卡拉允許你使用一個.或空白的消息發送:

foo bar(baz) 
// is the same as 
foo.bar(baz) 

此外,使用空格時消息發送,可以去掉最後一個參數列表中的括號,如果它只有一個單參數:

foo bar baz 
// is the same as 
foo bar(baz) 

最後,圓括號不僅用於參數列表,它們也用於分組。 (與元組文字,以及)可以總是包圍表達用括號澄清其優先權:

(foo).bar(baz) 
// is the same as 
foo.bar(baz)