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?


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.


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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.