85 votes

quel est le point de retour en Ruby?

Quelle est la différence entre return et la simple insertion d'une variable telle que celle-ci:

non-retour

 def write_code(number_of_errors)
    if number_of_errors > 1
       mood = "WTF"
    else
       mood = "No Problem"
    end  
   mood
end
 

revenir

  def write_code(number_of_errors)
    if number_of_errors > 1
       mood =  "WTF"
    else
       mood = puts "No Problem"
    end  
  return mood
end
 

126voto

Antal S-Z Points 17977

return vous permet de sortir plus tôt:

def write_code(number_of_errors)
  return "No problem" if number_of_errors == 0
  badness = compute_badness(number_of_errors)
  "WTF?!  Badness = #{badness}."
end

Si number_of_errors == 0, alors "No problem" sera immédiatement renvoyé. À la fin d'une méthode, cependant, il n'est pas nécessaire, comme vous l'avez remarqué.


Edit: Pour démontrer qu' return quitte immédiatement, pensez à 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"), il sera de retour "S-Z". Si vous l'appelez comme last_name(nil), il retourne nil. Si return n'a pas interrompre immédiatement, qu'il allait essayer de l'exécuter nil.split(/\s+/)[-1], ce qui permettrait de lever une erreur.

42voto

danneu Points 4365

"Retour" est inutile. Ruby renvoie la dernière expression évaluée.

Vous n'avez même pas besoin de cette "humeur" finale, pas plus que ces affectations dans la déclaration IF.

 def write_code(number_of_errors)
    if number_of_errors > 1
       "WTF"
    else
       "No Problem"
    end  
end

puts write_code(10)
 

Sortie:

WTF

4voto

philosodad Points 1047

J'utilise de retour quand je vais à travers une liste, et je veux quitter cette fonction si un membre de la liste remplit les critères. Je pourrais accomplir ceci avec un seul énoncé comme:

list.select{|k| k.meets_criteria}.length == 0

dans certaines situations, mais

list.each{|k| return false if k.meets_criteria}

est une ligne en trop--avec, à mon avis, certains plus de flexibilité. Par exemple, le premier exemple suppose que c'est la seule ligne dans la méthode, et que nous voulons le retour de ce point, peu importe quoi. Mais si c'est un test pour voir si il est sécuritaire de procéder avec le reste de la méthode, le premier exemple devrez gérer que d'une manière différente.

EDIT:

Pour ajouter un peu de souplesse, considérons 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 aujourd'hui, c'est assez souple de la ligne de code qui peut être appelée avec une liste de booléens méthodes et une liste des objets qui implémentent les méthodes.

MODIFIER

Il convient de noter que je suis en supposant que cette ligne est à l'intérieur d'une méthode, pas un bloc.


Mais c'est surtout un style de choix, je pense que dans la plupart des situations, vous pouvez éventuellement éviter d'utiliser de l' return.

4voto

msroot Points 226

Ruby revient toujours! le meilleur moyen est

 def write_code(number_of_errors)
  (number_of_errors > 1)? "WTF" : "No Problem"
end
 

cela signifie que si number_of_errors> 1, il retournera WTF sinon pas de problème

4voto

Kush Points 234

Son beau ruby donne cette bonne caractéristique de ne pas spécifier explicitement l'instruction return, mais je pense que, en tant que norme de programmation, on devrait toujours s'efforcer de spécifier les instructions "return" chaque fois que nécessaire. Cela aide à rendre le code plus lisible pour quelqu'un qui vient d'horizons différents comme le C ++, Java, PHP, etc. et l'apprentissage de ruby. La déclaration "return" ne fera aucun mal, alors pourquoi sauter la manière conventionnelle et plus standard de revenir des fonctions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X