¿Por qué Scala usa el operador '_' para importar paquetes en lugar de '*' como en Java?

17

En mi opinión, una de las mejores cosas de Scala es su interoperabilidad con Java y su sintaxis similar. Una cosa que me pareció extraña es el uso del _operador para las importaciones de paquetes wilcard en lugar del *operador que se usa en Java.

¿Hay alguna razón técnica para usar en _lugar de *? Si no, ¿por qué se hizo este cambio?

vainolo
fuente
Esto podría ser algo funcional. Sé que Haskell usa _ en algunos lugares para actuar como un comodín / valor no especificado.
KChaloux

Respuestas:

36

En Scala, el *es un identificador válido. Se podría escribir:

val * = "trollin'"
println(*)

Con el resultado siendo:

trollin'

Se podría escribir una clase llamada *como tal:

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

Entonces ese es el caso, cuando tengo una clase *en el paquete us.hexcodery escribo:

import us.hexcoder.*

Diría que desea importar una clase con el nombre *. Debido a esto, Scala necesitaba usar otro símbolo para indicar una importación de comodines. Por alguna razón, decidieron usarlo _como símbolo comodín.


fuente
9
La pregunta es, entonces, ¿por qué * fue elegido como un identificador válido y _ como comodín?
Mike Partridge
2
Aunque tengo más votos a favor, esta es la respuesta más correcta. Nunca antes había oído hablar de * como identificador.
Michael Brown
1
@MikeBrown También es válido en Lisp. Aquí hay un ejemplo en Scheme
18
@MikePatridge Casi definitivamente porque Scala define a todos sus operadores como funciones y permite al desarrollador definir sus propios operadores como tales. No tiene sintaxis de casos especiales para operadores, y *debe incluirse para la multiplicación. Entonces, otro personaje menos común necesitaba ser elegido como un personaje reservado.
KChaloux
3
El carácter _ se asemeja a un espacio en blanco (como en "llenar el espacio en blanco"), por lo que si Scala lo tomó prestado de otro lugar o lo ideó ellos mismos, tiene sentido usarlo como comodín.
Michael Shaw
13

En lenguajes funcionales, el carácter _ se usa comúnmente para decir, "No me importa este parámetro" o "cualquier cosa puede ir aquí". Ampliar ese valor a las importaciones de espacio de nombres solo tiene sentido.

Michael Brown
fuente
2

Además de la respuesta de Glenn, importes una declaración válida en cualquier lugar de Scala y usted puedeimport incluir un objeto o una instancia en miembros. Como *obviamente es miembro de muchas clases, no se puede usar como comodín para la importdeclaración. Entonces terminas con una cadena que no debe ser un identificador válido.

_me viene a la mente. El hecho de que se use en otros lugares con un significado diferente (tipo existencial, función como instancia) también se debe al mismo problema.

León
fuente
0

En Scala hay docenas de lugares donde se usa el guión bajo. Usarlo para importar comodines es solo una consecuencia lógica.

kiritsuku
fuente