Quand utiliser le signe égal dans une déclaration de méthode Scala?

85

Avec le signe égal:

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

Sans signe égal:

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

Les deux programmes ci-dessus s'exécutent de la même manière. Dans le billet de blog Choses que je n'aime pas dans Scala, j'ai lu que lorsque le signe égal est manquant, la méthode retournera Unit(identique à celle de Java void), donc les méthodes qui retournent une valeur doivent utiliser le signe égal. Mais les méthodes qui ne retournent pas de valeur peuvent être écrites de toute façon.

Quelle est la meilleure pratique pour utiliser le signe égal dans les méthodes Scala qui ne renvoient pas de valeur?

Esko Luontola
la source

Réponses:

108

En fait, je ne suis pas du tout d'accord avec Daniel. Je pense que la syntaxe non égale ne devrait jamais être utilisée. Si votre méthode est exposée en tant qu'API et que vous craignez de renvoyer accidentellement le mauvais type, ajoutez une annotation de type explicite:

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

La syntaxe non-égale est plus courte et peut paraître "plus propre", mais je pense qu'elle ajoute simplement la possibilité de confusion. J'ai parfois oublié d'ajouter un signe égal et j'ai cru que ma méthode retournait une valeur alors qu'en réalité elle retournait Unit. Étant donné que les syntaxes de type non égal et égal à inféré sont visuellement similaires, il est facile de passer à côté de ce problème.

Même si cela me coûte un peu plus de travail, je préfère les annotations de type explicite lorsqu'elles comptent (à savoir, les interfaces exposées).

Jorge Ortiz
la source
1
J'aime cette approche, elle est plus explicite et donc plus claire pour le lecteur.
Lukasz Korzybski
4
Apparemment, c'est maintenant le style recommandé ( docs.scala-lang.org/style/declarations.html#procedure_syntax ) donc je change cela pour être la réponse acceptée.
Esko Luontola le
1
Je suis d'accord avec cela aussi, je pense que la syntaxe sans le = devrait être complètement supprimée du langage
Ahmed Soliman Farghal
7
Martin Odersky dans son discours d'ouverture "Scala with Style" a déclaré que c'était une erreur historique. Il a dû ajouter cette syntaxe (sans =) pour qu'il puisse cacher "Unit" aux développeurs Java afin qu'ils ne soient pas confus. Il a également mentionné qu'il sera supprimé à l'avenir.
tabdulradi
2
Existe-t-il un moyen d'avertir si le signe égal a été oublié dans la définition de la méthode? En tant qu'option de compilateur, par exemple, ou dans n'importe quel outil d'analyse de source?
VasiliNovikov
42

MISE À JOUR: à partir de Scala-2.10, l'utilisation du signe égal est préférable. Ancienne réponse:

Les méthodes qui retournent Unitdoivent toujours utiliser la syntaxe non égale. Cela évite d'éventuelles erreurs de mise en œuvre dans l'API. Par exemple, vous pourriez avoir accidentellement fait quelque chose comme ceci:

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

Exemple trivial bien sûr, mais vous pouvez voir comment cela pourrait être un problème. Étant donné que la dernière expression ne retourne pasUnit , la méthode elle-même aura un type de retour autre que Unit. Ceci est exposé dans l'API publique et pourrait causer d'autres problèmes ultérieurement. Avec la syntaxe non égale, peu importe quelle est la dernière expression, Scala corrige le type de retour comme Unit.

C'est aussi deux personnages plus propres. :-) J'ai aussi tendance à penser que la syntaxe non égale rend le code un peu plus facile à lire. Il est plus évident que la méthode en question renvoie Unitplutôt qu'une valeur utile.

Dans le même ordre d'idées, il existe une syntaxe analogue pour les méthodes abstraites:

trait Foo {
  def bar(s: String)
}

La méthode bara une signature String=>Unit. Scala fait cela lorsque vous omettez l'annotation de type sur un membre abstrait. Encore une fois, c'est plus propre et (je pense) plus facile à lire.

Daniel Spiewak
la source
3
Ne pas utiliser le signe égal est également la recommandation du Guide de style Scala: davetron5000.github.com/scala-style/types/inference
Esko Luontola
6
Je l'ai écrit, vous devriez donc probablement garder cela à l'esprit lorsque vous pesez la référence. :-)
Daniel Spiewak
LoL, j'ai donc décrit ce petit échange à ma copine, sauf à cause de ma pauvre énonciation "bit" est sorti comme "salope". Inutile de dire que la comédie s'en est suivie.
Saem
10
ScalaDays 2013, Martin Odersky, Keynote - Scala avec style chapitre 45 : la déclaration de procédure (syntaxe non égale) doit être évitée.
senia
4
Le guide de style officiel ne le recommande plus: docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein
12

Vous devez utiliser des déclarations d'appel de signe égal à l'exception des définitions renvoyant Unit.

Dans ce dernier cas, vous pouvez renoncer au signe égal. Cette syntaxe peut cependant être obsolète, il vaut donc mieux l'éviter. L'utilisation du signe égal et la déclaration du type de retour fonctionnera toujours.

Daniel C. Sobral
la source
Livres, liste de diffusion, code source. Soit dit en passant, depuis lors, il est devenu clair que cette dernière syntaxe est peu susceptible d'être obsolète et qu'elle est favorisée par beaucoup.
Daniel C.Sobral
1
docs.scala-lang.org/style/types.html#function_values On dirait que le guide de style des types indique en utilisant = tout le temps de toute façon.
BeepDog
4

Pour les méthodes, Scala Style Guide recommande la syntaxe égale par opposition à la syntaxe de procédure

Syntaxe de la procédure

Évitez la syntaxe de la procédure, car elle a tendance à être déroutante pour très peu de gain de brièveté.

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

Une chose: imaginez la dernière instruction d'une méthode qui devrait retourner Unit ne retourne pas Unit. Utiliser la syntaxe non égale est alors très pratique, j'espère que cela ne sera pas obsolète car je vois plusieurs cas d'utilisation pour cela

Jos
la source
0

Au fil du temps, le style par défaut a changé, et cela a été mentionné dans de nombreux commentaires aux réponses, il est recommandé dans le guide de style officiel d'utiliser la =syntaxe pour les déclarations de fonctions.

BeepDog
la source
1
Le lien que vous avez fourni ne parle que des fonctions, pas des procédures (c'est-à-dire des fonctions qui renvoient Unit).
Esko Luontola le
Vous avez raison, @EskoLuontola, désolé, j'ai probablement copié le mauvais lien sur l'un des nombreux onglets que j'avais ouverts, il a été mis à jour.
BeepDog
0

pour les méthodes qui n'ont pas de valeur de retour, un moyen d'exprimer de telles méthodes consiste à omettre le type de résultat et le signe égal, en suivant la méthode avec un bloc entre accolades. Sous cette forme, la méthode ressemble à une procédure, une méthode qui n'est exécutée que pour ses effets secondaires.

sofiene zaghdoudi
la source