¿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?


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.


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.


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.