Eu tomei um olhar para a lista de pesquisas taken on scala-lang.org e notei uma pergunta curiosa: " ‘Você pode nomear todos os usos de’_ ". Você pode? Se sim, faça-o aqui. Exemplos explicativos são apreciados.
540
Eu tomei um olhar para a lista de pesquisas taken on scala-lang.org e notei uma pergunta curiosa: " ‘Você pode nomear todos os usos de’_ ". Você pode? Se sim, faça-o aqui. Exemplos explicativos são apreciados.
Respostas:
Os que eu consigo pensar são
Tipos existenciais
Parâmetros do tipo de classificação superior
Variáveis ignoradas
Parâmetros ignorados
Nomes ignorados de tipos próprios
Padrões curinga
Padrões curinga em interpolações
Curinga da sequência nos padrões
Importações curinga
Ocultando importações
Associando cartas aos operadores
Operadores de atribuição
Sintaxe do espaço reservado
Valores do método
Convertendo parâmetros de chamada por nome em funções
Inicializador padrão
Pode haver outros que eu esqueci!
Exemplo mostrando o porquê
foo(_)
efoo _
são diferentes:Este exemplo vem de 0__ :
No primeiro caso,
process _
representa um método; Scala usa o método polimórfico e tenta torná-lo monomórfico preenchendo o parâmetro type, mas percebe que não há um tipo que possa ser preenchido paraA
que dê o tipo(_ => Unit) => ?
(Existential_
não é um tipo).No segundo caso,
process(_)
é um lambda; ao escrever um lambda sem nenhum tipo de argumento explícito, Scala deduz o tipo do argumento queforeach
espera e_ => Unit
é um tipo (enquanto simplesmente_
não é), para que possa ser substituído e inferido.Essa pode ser a pegadinha mais complicada de Scala que eu já encontrei.
Observe que este exemplo compila na 2.13. Ignore-o como se estivesse atribuído a sublinhado.
fonte
val x: Any = _
println _
eprintln(_)
são diferentes. Você pode ver isso, por exemplo, no fato de eles lidarem com tipos existenciais e polimórficos de maneira um pouco diferente. Virá com um exemplo daqui a pouco.De (minha entrada) na FAQ , que certamente não garanto que esteja completa (adicionei duas entradas há apenas dois dias):
Isso também faz parte desta pergunta .
fonte
var i: Int = _
ou o caso especial de correspondência de padrãoval (a, _) = (1, 2)
ou o caso especial de val descartadofor (_ <- 1 to 10) doIt()
def f: T; def f_=(t: T)
combinação para criar membro f mutável._
nomes dos métodos estão trapaceando. Mas tudo bem. Eu só espero que alguém atualizações então o FAQ ... :-)Uma excelente explicação dos usos do sublinhado é Scala _ [underscore] magic .
Exemplos:
No Scala,
_
age de maneira semelhante ao*
Java ao importar pacotes.No Scala, um getter e um setter serão implicitamente definidos para todos os vars não privados em um objeto. O nome do getter é igual ao nome da variável e
_=
é adicionado ao nome do setter.Uso:
Se você tentar atribuir uma função a uma nova variável, a função será invocada e o resultado será atribuído à variável. Essa confusão ocorre devido aos colchetes opcionais para invocação de método. Devemos usar _ após o nome da função para atribuí-lo a outra variável.
fonte
List(1,2,3,4,5).foreach(print(_))
é muito mais legível apenas para fazerList(1,2,3,4,5).foreach(print)
, você nem precisa realmente o sublinhado em tudo, mas eu acho que é apenas uma questão de estiloHá um uso que posso ver que todos aqui parecem ter esquecido de listar ...
Em vez de fazer isso:
Você pode simplesmente fazer isso:
fonte
n => n
Aqui estão mais alguns exemplos onde
_
é usado:Nos exemplos acima, um sublinhado representa um elemento na lista (para reduzir o primeiro sublinhado representa o acumulador)
fonte
Além dos usos que JAiro mencionou, eu gosto deste:
Se alguém precisar de todas as propriedades da conexão, ele pode fazer:
Se você precisar de apenas um host e uma porta, poderá:
fonte
Há um exemplo específico que "_" seja usado:
pode ser igual a:
A aplicação de "_" em alguns cenários será automaticamente convertida em "(x $ n) => x $ n"
fonte