Quelle est la différence entre return
et simplement mettre une variable telle que la suivante:
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
mood
end
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = puts "No Problem"
end
return mood
end
return
vous permet d'éclater tôt:
def write_code(number_of_errors)
return "No problem" if number_of_errors == 0
badness = compute_badness(number_of_errors)
"WHAT?! Badness = #{badness}."
end
Si number_of_errors == 0
, Alors "No problem"
Sera retourné immédiatement. À la fin d'une méthode, cependant, ce n'est pas nécessaire, comme vous l'avez observé.
Edit: Pour démontrer que return
se ferme immédiatement, considérez cette fonction:
def last_name(name)
return nil unless name
name.split(/\s+/)[-1]
end
Si vous appelez cette fonction en tant que last_name("Antal S-Z")
, elle renverra "S-Z"
. Si vous l'appelez comme last_name(nil)
, il renvoie nil
. Si return
n'a pas abandonné immédiatement, il tentera d'exécuter nil.split(/\s+/)[-1]
, ce qui générera une erreur.
L'utilisation de "return" n'est pas nécessaire s'il s'agit de la dernière ligne à exécuter dans la méthode, car Ruby renvoie automatiquement la dernière expression évaluée.
Vous n'avez même pas besoin de cette "humeur" finale, ni de ces affectations dans l'instruction IF.
def write_code(number_of_errors)
if number_of_errors > 1
"ERROR"
else
"No Problem"
end
end
puts write_code(10)
Sortie:
ERREUR
Ruby revient toujours! le meilleur moyen est
def write_code(number_of_errors)
(number_of_errors > 1)? "ERROR" : "No Problem"
end
cela signifie que si number_of_errors> 1, il retournera ERROR else Pas de problème
J'utilise return lorsque je parcours une liste et je souhaite quitter la fonction si un membre de la liste répond à un critère. Je pourrais accomplir cela avec une seule déclaration comme:
list.select{|k| k.meets_criteria}.length == 0
dans certaines situations, mais
list.each{|k| return false if k.meets_criteria}
est aussi une ligne - avec, à mon avis, une certaine flexibilité supplémentaire. Par exemple, le premier exemple suppose qu'il s'agit de la seule ligne de la méthode et que nous voulons revenir à partir de ce point quoi qu'il arrive. Mais s'il s'agit d'un test pour voir s'il est sûr de poursuivre avec le reste de la méthode, le premier exemple devra gérer cela d'une manière différente.
MODIFIER:
Pour ajouter une certaine flexibilité, considérez la ligne de code suivante:
list_of_method_names_as_symbols.each{|k| list_of_objects.each{|j| return k if j.send(k)}}
Je suis sûr que cela peut être accompli, en une seule ligne, sans return
, mais du haut de ma tête, je ne vois pas comment.
Mais c'est maintenant une ligne de code assez flexible qui peut être appelée avec n'importe quelle liste de méthodes booléennes et une liste d'objets qui implémentent ces méthodes.
MODIFIER
Il convient de noter que je suppose que cette ligne est à l'intérieur d'une méthode, pas d'un bloc.
Mais c'est surtout un choix stylistique, je pense que dans la plupart des situations, vous pouvez et devriez éviter d'utiliser return
.
Son Nice Ruby donne cette bonne caractéristique de ne pas spécifier explicitement l'instruction de retour, mais je pense simplement, en tant que norme de programmation, que l'on devrait toujours s'efforcer de spécifier des instructions de "retour" partout où cela est nécessaire. Cela aide à faire du code plus lisible pour quelqu'un qui vient d'horizons différents comme C++, Java, PHP etc. et apprendre Ruby. L'instruction "return" ne nuira à rien, alors pourquoi ignorer les méthodes de retour conventionnelles et plus standard des fonctions.
Une petite mise en garde pour ceux qui viennent d'autres langues. Supposons que vous ayez une fonction comme celle des OP et que vous utilisiez la règle de la "dernière chose calculée" pour définir automatiquement votre valeur de retour:
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
end
et disons que vous ajoutez une instruction de débogage (ou de journalisation):
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
puts "### mood = #{mood}"
end
Maintenant devinez quoi. Vous avez cassé votre code, car le puts
retourne nil, qui devient maintenant la valeur de retour de la fonction.
La solution est de prendre l'habitude de toujours mettre explicitement la valeur de retour sur la dernière ligne, comme l'OP l'a fait:
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
puts "### mood = #{mood}"
mood
end