2013-02-11 126 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,反之亦然。