我在理解以下几段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”的努力转化为调用者类型?
由于
答案 0 :(得分: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)
^
简单地说,1.
在Scala中是有效的Double
(就像在Java中一样),所以Scala实际上是这样做的:
1. + (1)
也就是说,将Double
添加到(冗余)括号内的表达式中。
对于后者,Scala遵循Java约定,任何添加到String
的内容都会产生String
,反之亦然。