Quando usar o sinal de igual em uma declaração de método Scala?

85

Com sinal de igual:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

Sem sinal de igual:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

Ambos os programas acima são executados da mesma maneira. Na postagem do blog Coisas que eu não gosto no Scala , li que quando o sinal de igual está faltando, o método retornará Unit(o mesmo que o de Java void), então os métodos que retornam um valor devem usar o sinal de igual. Mas os métodos que não retornam um valor podem ser escritos de qualquer maneira.

Qual é a prática recomendada para usar o sinal de igual em métodos Scala que não retornam um valor?

Esko Luontola
fonte

Respostas:

109

Na verdade, eu discordo fortemente de Daniel. Eu acho que a sintaxe não igual nunca deve ser usada. Se seu método está sendo exposto como uma API e você está preocupado em retornar acidentalmente o tipo errado, adicione uma anotação de tipo explícita:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

A sintaxe não igual é mais curta e pode parecer "mais limpa", mas acho que apenas adiciona a possibilidade de confusão. Algumas vezes esqueci de adicionar um sinal de igual e acreditei que meu método estava retornando um valor quando na verdade estava retornando Unit. Como as sintaxes não igual e igual ao tipo inferido são visualmente semelhantes, é fácil perder esse problema.

Embora me custe um pouco mais de trabalho, prefiro as anotações de tipo explícito quando importam (ou seja, interfaces expostas).

Jorge Ortiz
fonte
1
Eu gosto dessa abordagem, é mais explícita e, portanto, mais clara para o leitor.
Lukasz Korzybski
4
Aparentemente, agora esse é o estilo recomendado ( docs.scala-lang.org/style/declarations.html#procedure_syntax ), então estou mudando para que seja a resposta aceita.
Esko Luontola
1
Também concordo com isso, acho que a sintaxe sem o = deve ser totalmente removida da linguagem
Ahmed Soliman Farghal
7
Martin Odersky em sua palestra "Scala with Style" disse que foi um erro histórico. Ele teve que adicionar esta sintaxe (sem =) para que ele possa ocultar "Unidade" dos desenvolvedores Java para que eles não se confundam. Ele também mencionou que ele será removido no futuro.
tabdulradi de
2
Existe alguma maneira de AVISAR se o sinal de igual foi esquecido na definição do método? Como opção do compilador, por exemplo, ou em qualquer ferramenta de análise de código-fonte?
VasiliNovikov
42

ATUALIZAÇÃO: a partir do Scala-2.10, é preferível usar o sinal de igual. Resposta antiga:

Os métodos que retornam Unitdevem sempre usar a sintaxe não igual. Isso evita possíveis erros de implementação na API. Por exemplo, você pode ter feito algo assim acidentalmente:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

É um exemplo trivial, mas você pode ver como isso pode ser um problema. Como a última expressão não retorna Unit, o próprio método terá um tipo de retorno diferente de Unit. Isso é exposto na API pública e pode causar outros problemas no futuro. Com a sintaxe não igual, não importa qual seja a última expressão, Scala corrige o tipo de retorno como Unit.

Também é mais limpo de dois personagens. :-) Eu também tendo a pensar que a sintaxe não igual torna o código um pouco mais fácil de ler. É mais óbvio que o método em questão retorna Unitao invés de algum valor útil.

Em uma nota relacionada, há uma sintaxe análoga para métodos abstratos:

trait Foo {
  def bar(s: String)
}

O método barpossui assinatura String=>Unit. Scala faz isso quando você omite a anotação de tipo em um membro abstrato. Mais uma vez, é mais limpo e (eu acho) mais fácil de ler.

Daniel Spiewak
fonte
3
Não usar o sinal de igual também é a recomendação no Guia de estilo Scala: davetron5000.github.com/scala-style/types/inference/…
Esko Luontola
6
Eu escrevi essa parte, então você provavelmente deve ter isso em mente quando pesar a referência. :-)
Daniel Spiewak
LoL, então eu descrevi essa pequena troca para minha namorada, exceto que devido à minha pronúncia pobre "bit" saiu como "vadia". Desnecessário dizer que a comédia se seguiu.
Saem
10
ScalaDays 2013, Martin Odersky, Keynote - Scala com estilo capítulo 45 : declaração de procedimento (sintaxe não igual) deve ser evitada.
Senia
4
O guia de estilo oficial não recomenda mais isso: docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein
12

Você deve usar declarações de chamada de sinal de igual, exceto as definições que retornam Unit.

Neste último caso, você pode renunciar ao sinal de igual. Essa sintaxe pode estar obsoleta, portanto, é melhor evitá-la. Usar o sinal de igual e declarar o tipo de retorno sempre funcionará.

Daniel C. Sobral
fonte
Livros, lista de distribuição, código-fonte. A propósito, desde aquela época, ficou claro que a última sintaxe dificilmente será reprovada e é a preferida por muitos.
Daniel C. Sobral
1
docs.scala-lang.org/style/types.html#function_values Parece que o guia de estilo de tipos indica o uso de = o tempo todo.
BeepDog
4

Para métodos, o Guia de Estilo Scala recomenda a sintaxe equals em oposição à sintaxe de procedimento

Sintaxe de procedimento

Evite a sintaxe do procedimento, pois ela tende a ser confusa para obter muito pouco ganho de brevidade.

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}
cmd
fonte
0

Uma coisa: imagine que o último comando de um método que deve retornar Unit não retorna Unit. Usar a sintaxe não igual é muito conveniente, espero que não se torne obsoleto, pois vejo vários casos de uso para ela

Jos
fonte
0

Conforme o tempo avançava, o estilo padrão mudou, e isso foi mencionado em muitos dos comentários às respostas, é recomendado no guia de estilo oficial usar a =sintaxe para declarações de função.

BeepDog
fonte
1
O link fornecido fala apenas sobre funções, não procedimentos (ou seja, funções que retornam Unidade).
Esko Luontola
Você está certo, @EskoLuontola, Desculpe, provavelmente copiei o link errado de uma das muitas abas que abri, ele foi atualizado.
BeepDog de
0

para métodos que não possuem valor de retorno, uma forma de expressar tais métodos é omitir o tipo de resultado e o sinal de igual, seguindo o método com um bloco entre chaves. Nesta forma, o método parece um procedimento, um método que é executado apenas para seus efeitos colaterais.

sofiene zaghdoudi
fonte