web-dev-qa-db-ja.com

Scalaは、Javaのように「*」ではなく「_」演算子をパッケージのインポートに使用するのはなぜですか?

私の意見では、Scalaの最大の利点の1つは、Javaおよびその類似の構文との相互運用性です。私が奇妙だと思ったのは、 Javaで使用される_演算子の代わりに、パッケージワイルドカードインポートの*演算子。

_の代わりに*を使用する技術的な理由はありますか?そうでない場合、なぜこの変更が行われたのですか?

17
vainolo

Scalaでは、*は有効な識別子です。次のように書くことができます:

val * = "trollin'"
println(*)

結果は次のとおりです。

trollin'

*という名前のクラスを次のように書くことができます:

class * {
  def test():String = {
    "trollin'"
  }
}

ですから、その場合、パッケージに*というクラスがあり、us.hexcoderを書いて、次のように記述します。

import us.hexcoder.*

あなたは*という名前のクラスをインポートしたいと言っているでしょう。このため、Scalaは、ワイルドカードのインポートを示すために別の記号を使用する必要がありました。何らかの理由で、ワイルドカード記号として_を使用することにしました。

36
user7007

関数型言語では、_文字は一般に「このパラメーターは気にしない」または「何でもここに入る」と言うために使用されます。その値をネームスペースのインポートに拡張することは意味があります。

13
Michael Brown

Glennの答えに加えて、importはScalaのどこでも有効なステートメントであり、オブジェクトまたはインスタンスメンバーをスコープにimportすることができます。As *は明らかに多くのクラスのメンバーであり、importステートメントのワイルドカードとして使用することはできません。したがって、有効な識別子であってはならない文字列で終わることになります。

_ 頭に浮かぶ。他の場所で別の意味(存在するタイプ、インスタンスとしての機能)に使用されていることも、同じ問題によるものです。

2
Leo

Scalaには、アンダースコアが使用されている 数十の場所 があります。ワイルドカードインポートにそれを使用することは、論理的に重要です。

0
kiritsuku