2

次のいくつかの scala コードの背後にある理論的根拠を理解するのに少し苦労しています。

REPL では 1 + 1 = 2 であることは誰もが知っています。

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」を呼び出し元の型に変換するのではなく、文字列になるのはなぜですか?

ありがとう

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)
       ^

簡単に言えば、Scalaでは(Javaの場合と同様に)1.有効なDoubleので、Scalaは実際にこれを行っています。

1.  +  (1)

つまりDouble、(冗長な)括弧で囲まれた式へのaの追加を挿入します。

String後者に関しては、ScalaはJavaの規則に従い、結果に追加されたものはすべてaにStringなり、その逆も同様です。

于 2013-02-11T08:05:50.530 に答える