Pourquoi Scala utilise-t-il l'opérateur '_' pour l'importation de packages au lieu de '*' comme en Java?


17

À mon avis, l'un des plus grands avantages de Scala est son interopérabilité avec Java et sa syntaxe similaire. Une chose que j'ai trouvée étrange est l'utilisation de l' _opérateur pour les importations de cartes wilcard au lieu de l' *opérateur utilisé en Java.

Y a-t-il une raison technique pour utiliser _au lieu de *? Sinon, pourquoi ce changement a-t-il été fait?


Cela pourrait simplement être une chose fonctionnelle. Je sais que Haskell utilise _ à quelques endroits pour agir comme une valeur générique / non spécifiée.
KChaloux

Réponses:


36

Dans Scala, le *est un identifiant valide. On pourrait écrire:

val * = "trollin'"
println(*)

Le résultat étant:

trollin'

On pourrait écrire une classe nommée *comme telle:

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

Donc, cela étant le cas, lorsque j'ai une classe *dans le package us.hexcoderet que j'écris:

import us.hexcoder.*

Vous diriez que vous souhaitez importer une classe avec le nom *. Pour cette raison, Scala devait utiliser un autre symbole pour indiquer une importation générique. Pour une raison quelconque, ils ont décidé d'utiliser _comme symbole générique.


9
La question devient alors, pourquoi a-t-on choisi * comme identifiant valide et _ comme caractère générique?
Mike Partridge

2
Même si j'ai plus de votes positifs, c'est la réponse la plus correcte. Jamais entendu parler de * comme identifiant auparavant.
Michael Brown

1
@MikeBrown Il est également valable en Lisp. Voici un exemple dans Scheme

18
@MikePatridge Presque certainement parce que Scala définit tous ses opérateurs comme des fonctions et permet au développeur de définir leurs propres opérateurs comme tels. Il ne fait pas de syntaxe de cas spécial pour les opérateurs, et *devait être inclus pour la multiplication. Un autre caractère moins courant devait donc être choisi comme caractère réservé.
KChaloux

3
Le caractère _ ressemble à un blanc (comme dans "remplir le blanc"), donc que Scala l'ait emprunté ailleurs ou l'ait inventé lui-même, il est logique de l'utiliser comme caractère générique.
Michael Shaw

13

Dans les langages fonctionnels, le caractère _ est couramment utilisé pour dire "Je ne me soucie pas de ce paramètre" ou "tout peut aller ici". Étendre cette valeur aux importations d'espace de noms n'a de sens que.


2

En plus de la réponse de Glenn, importest une déclaration valide n'importe où dans Scala et vous pouvez importun objet ou un membre d'instance dans la portée. Comme il *est évidemment membre de nombreuses classes, il ne peut pas être utilisé comme caractère générique pour l' importinstruction. Vous vous retrouvez donc avec une chaîne qui ne doit pas être un identifiant valide.

_vient à l'esprit. Le fait qu'il soit utilisé dans d'autres endroits pour une signification différente (type existentiel, fonction d'instance) est également dû au même problème.


0

À Scala, il y a des dizaines d'endroits où le trait de soulignement est utilisé. Son utilisation pour les importations de caractères génériques n'est qu'une conséquence logique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.