Warum verwendet Scala den Operator '_' für den Paketimport anstelle von '*' wie in Java?

17

Meiner Meinung nach ist eines der größten Dinge an Scala die Interoperabilität mit Java und die ähnliche Syntax. Eine Sache, die ich seltsam fand, ist die Verwendung des _Operators für Paket-Wilcard-Importe anstelle des *Operators, der in Java verwendet wird.

Gibt es einen technischen Grund für die Verwendung _anstelle von *? Wenn nicht, warum wurde diese Änderung vorgenommen?

vainolo
quelle
Dies könnte nur eine funktionale Sache sein. Ich weiß, dass Haskell _ an einigen Stellen verwendet, um als Platzhalter / nicht angegebener Wert zu fungieren.
KChaloux

Antworten:

36

In Scala ist das *ein gültiger Bezeichner. Man könnte schreiben:

val * = "trollin'"
println(*)

Mit dem Ergebnis:

trollin'

Man könnte eine Klasse schreiben, die *so heißt:

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

Wenn ich also eine Klasse *im Paket habe us.hexcoderund schreibe:

import us.hexcoder.*

Sie würden sagen, dass Sie eine Klasse mit dem Namen importieren möchten *. Aus diesem Grund musste Scala ein anderes Symbol verwenden, um auf einen Platzhalterimport hinzuweisen. Aus welchem ​​Grund auch immer, sie entschieden sich dafür _, das Platzhalterzeichen zu verwenden.


quelle
9
Dann stellt sich die Frage, warum * als gültiger Bezeichner und _ als Platzhalter gewählt wurde.
Mike Partridge
2
Obwohl ich mehr positive Stimmen habe, ist dies die richtigere Antwort. Noch nie zuvor von * als Identifikator gehört.
Michael Brown
1
@MikeBrown Es ist auch in Lisp gültig. Hier ist ein Beispiel in Schema
18
@MikePatridge Mit ziemlicher Sicherheit, da Scala alle Operatoren als Funktionen definiert und dem Entwickler die Möglichkeit gibt, eigene Operatoren als solche zu definieren. Für Operatoren wird keine Spezialsyntax verwendet. Sie musste *für die Multiplikation einbezogen werden. Daher musste ein anderes, weniger verbreitetes Zeichen als reserviertes Zeichen ausgewählt werden.
KChaloux
3
Das _-Zeichen ähnelt einem Leerzeichen (wie in "Lückentext ausfüllen"). Unabhängig davon, ob Scala es von einer anderen Stelle ausgeliehen oder selbst erfunden hat, ist es sinnvoll, es als Platzhalter zu verwenden.
Michael Shaw
13

In funktionalen Sprachen wird das Zeichen _ häufig verwendet, um zu sagen: "Dieser Parameter interessiert mich nicht" oder "Hier kann alles hingehen". Es ist nur sinnvoll, diesen Wert auf Namespace-Importe zu erweitern.

Michael Brown
quelle
2

Zusätzlich zu Glenns Antwort importist überall in Scala eine gültige Aussage und Sie können importein Objekt oder eine Instanz in den Geltungsbereich aufnehmen. Da *es sich offensichtlich um ein Mitglied vieler Klassen handelt, kann es nicht als Platzhalter für die importAnweisung verwendet werden. Sie erhalten also eine Zeichenfolge, die kein gültiger Bezeichner sein darf.

_kommt in den Sinn. Die Tatsache, dass es an anderen Stellen für eine andere Bedeutung verwendet wird (existentieller Typ, Funktion als Instanz), ist ebenfalls auf dasselbe Problem zurückzuführen.

Löwe
quelle
0

In Scala gibt es Dutzende von Stellen, an denen der Unterstrich verwendet wird. Die Verwendung für Platzhalterimporte ist nur eine logische Konsequenz.

kiritsuku
quelle