2

我在理解以下几段 scala 代码背后的基本原理时遇到了一些麻烦:

我们都知道 REPL 中的 1 + 1 = 2。

scala> 1 + 1
res0: Int = 2

如果我输入“Abc”+“Def”,我应该在 REPL 中得到“AbcDef”。

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

现在假设我在 String "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”转换为调用者类型?

谢谢

4

1 回答 1

10

如果你在 Scala 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)
       ^

简单地说,在 Scala1.中是有效Double的(就像在 Java 中一样),所以 Scala 确实是这样做的:

1.  +  (1)

也就是说,将 a 添加Double到包含在(冗余)括号内的表达式中。

至于后者,Scala 遵循 Java 约定,任何添加到 a 的内容都会String导致 a String,反之亦然。

于 2013-02-11T08:05:50.530 回答