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


17

私の意見では、Scalaの最大の利点の1つは、Javaとの相互運用性および類似の構文です。奇妙なことに_気づい*たのは、Javaで使用されている演算子の代わりに、パッケージウィルカードのインポートに演算子を使用していることです。

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


これは単に機能的なものかもしれません。Haskellは、いくつかの場所で_を使用して、ワイルドカード/指定されていない値として機能することを知っています。
KChaloux

回答:


36

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

val * = "trollin'"
println(*)

結果は次のとおりです。

trollin'

次の*ような名前のクラスを作成できます。

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

その*ため、パッケージにクラスがありus.hexcoder、次のように記述している場合、

import us.hexcoder.*

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


9
問題は、なぜ*が有効な識別子として選択され、_がワイルドカードとして選択されたのですか?
マイクパートリッジ

2
私はより多くの賛成票を持っていますが、これはより正しい答えです。以前は識別子として*を聞いたことがない
マイケルブラウン

1
@MikeBrown Lispでも有効です。Schemeの

18
@MikePatridgeはほぼ間違いなく、Scalaはすべての演算子を関数として定義し、開発者が独自の演算子を定義できるようにしているためです。演算子の特別な場合の構文は行わず*、乗算に含める必要があります。したがって、あまり一般的ではない別の文字を予約文字として選択する必要がありました。
KChaloux

3
_文字は空白に似ているため(「空白を埋める」のように)、Scalaが他の場所から借用したか、自分で思いついたとしても、ワイルドカードとして使用するのは理にかなっています。
マイケルショー

13

関数型言語では、「このパラメーターは重要ではありません」または「何でもここに入れることができます」と言うために_文字がよく使用されます。その値を名前空間のインポートに拡張するのは理にかなっています。


2

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

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


0

Scalaには、アンダースコアが使用される場所が多数あります。ワイルドカードのインポートに使用することは、当然の結果です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.