2013-02-11 90 views
2

我有一個小麻煩了解的Scala代碼以下幾件背後的基本原理添加一個詮釋爲String。在斯卡拉

scala> 1 + 1 
res0: Int = 2 

如果我輸入「Abc」+「Def」,我應該在REPL中得到「AbcDef」。

scala> "Abc" + "Def" 
res6: java.lang.String = AbcDef 

現在,讓我們說,我援引的字符串「ABC」的+法,並通過「DEF」作爲參數:

scala> "Abc".+("Def") 
res7: java.lang.String = AbcDef 

通過同樣的理由,爲什麼像1 +(1 )返回一個雙2.0?

scala> 1.+(1) 
res1: Double = 2.0 

另外,爲什麼不通過參數「1」作爲參數,結果「1.01」如下:

scala> 1.+("1") 
res9: String = 1.01 

爲什麼是返回結果的字符串,而不是努力的爲「1」把我轉換成來電類型?

感謝

回答

10

如果你試穿的斯卡拉2.10.0,你會得到一個線索答案:

scala> 1.+(1) 
<console>:1: warning: This lexical syntax is deprecated. From scala 2.11, 
      a dot will only be considered part of a number if it is immediately 
      followed by a digit. 
     1.+(1) 
    ^

簡而言之,1.是Scala有效Double(因爲它是Java),所以Scala的真正做的是這樣的:

1. + (1) 

即,綴添加Double到包圍的(冗餘內的表達)parenth ESIS。

至於後者,Scala遵循Java約定,任何添加到String的結果都會導致String,反之亦然。