Por que Scala usa o operador '_' para importação de pacotes em vez de '*' como em Java?

17

Na minha opinião, uma das maiores coisas sobre o Scala é sua interoperabilidade com Java e sua sintaxe semelhante. Uma coisa que achei estranha é o uso do _operador para importação de pacotes wilcard em vez do *operador usado em Java.

Existe uma razão técnica para usar em _vez de *? Caso contrário, por que essa alteração foi feita?

vainolo
fonte
Isso pode ser apenas uma coisa funcional. Eu sei que Haskell usa _ em alguns lugares para atuar como um valor curinga / não especificado.
KChaloux # 11/13

Respostas:

36

No Scala, o *é um identificador válido. Alguém poderia escrever:

val * = "trollin'"
println(*)

Com o resultado sendo:

trollin'

Pode-se escrever uma classe chamada *assim:

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

Sendo assim, quando eu tenho uma classe *no pacote us.hexcodere escrevo:

import us.hexcoder.*

Você estaria dizendo que deseja importar uma classe com o nome *. Por esse motivo, o Scala precisava usar outro símbolo para indicar uma importação de curinga. Por qualquer motivo, eles decidiram usar _como símbolo curinga.


fonte
9
A questão é então: por que foi escolhido * como um identificador válido e _ como curinga?
Mike Partridge
2
Mesmo tendo mais votos positivos, esta é a resposta mais correta. Nunca ouvi falar de * como um identificador antes.
Michael Brown
1
@MikeBrown Também é válido no Lisp. Aqui está um exemplo no esquema
18
@MikePatridge Quase definitivamente porque a Scala define todos os seus operadores como funções e permite que o desenvolvedor defina seus próprios operadores como tais. Não possui sintaxe de caso especial para operadores e *precisava ser incluída para multiplicação. Portanto, outro caractere menos comum precisava ser escolhido como caractere reservado.
KChaloux
3
O caractere _ se assemelha a um espaço em branco (como em "preencha o espaço em branco"); portanto, se o Scala o emprestou de outro lugar ou o criou, faz sentido usá-lo como um curinga.
Michael Shaw
13

Nas linguagens funcionais, o caractere _ é comumente usado para dizer "não me importo com esse parâmetro" ou "qualquer coisa pode ser usada aqui". Estender esse valor às importações de namespace apenas faz sentido.

Michael Brown
fonte
2

Além da resposta de Glenn, importhá uma declaração válida em qualquer lugar do Scala e você pode importincluir um objeto ou uma instância no escopo. Como *é obviamente um membro de muitas classes, ele não pode ser usado como curinga para a importinstrução. Então você acaba com uma string que não deve ser um identificador válido.

_vem à mente. O fato de ser usado em outros lugares para um significado diferente (tipo existencial, funcionar como uma instância) também se deve ao mesmo problema.

Leo
fonte
0

Em Scala, existem dezenas de lugares onde o sublinhado é usado. Usá-lo para importações de curingas é apenas uma consequência lógica.

kiritsuku
fonte