4

私は Scala に詳しくないので、インタラクティブ モードを使用しているときに以下の問題に遭遇します。

scala>"abc"+4
res0: java.lang.String = abc4
scala>4+"abc"
res1: String = 4abc

私が興味を持っているのは、結果の型がどのように異なるか ( java.lang.Stringvs String) です。そして Book Seven Languages in Seven Weeksでは、2 つのタイプは両方ともjava.lang.String.

ところで、scala インタープリターのバージョンは 2.9.1 です。

4

2 に答える 2

7

JVMでは、scalaStringは単なるエイリアスjava.lang.Stringです。Replがタイプを表示することStringjava.lang.Stringあれば、実行時の動作にまったく影響を与えないマイナーな(REPL固有の)グリッチとして表示することもあります。

その価値については、これが私がscala 2.10-RC1で得たものです:

scala> "abc"+4
res0: String = abc4

scala> 4+"abc"
res1: String = 4abc
于 2012-11-13T15:11:37.763 に答える
0

なんでしょう ???

scala> (4+"abc").getClass.getName
res3: java.lang.String = java.lang.String

scala> ("abc"+4).getClass.getName
res5: java.lang.String = java.lang.String

どちらも java.lang.String です。StringInteractive Interpreter は単にnotと言っているだけだと思いますjava.lang.String。しかし、java.lang.String インスタンスがあります。

("abc"+4): '+' is applied to java.lang.String, and returns java.lang.String. This is true both on Java and Scala.

(4+"abc") on Java: '+' is applied to java.lang.Integer, and returns java.lang.String.

(4+"abc") on Scala: '+' is applied to scala.Int, and returns String. '+(x: String)' is defined on scala.Int.

Interactive Interpreter の出力で、type String = java.lanag.StringPredef.scala で定義されている が適用されます。もちろん、逆は定義されていません。

これはとても汚く見える

私はそうは思わない。

それらが常に文字列になるように一貫している必要があります

私はそうは思わない。一貫しています。

Java バージョン「1.7.0_09」

Scala コード ランナー バージョン 2.9.2

于 2012-11-14T07:39:04.837 に答える