Ancienne question (et "répondu"), mais je vais jeter mes deux cents en guise de réponse.
TL; DR - Vous n'êtes pas obligé, mais cela peut rendre votre code beaucoup plus clair dans certains cas.
Bien que ne pas utiliser de retour explicite puisse être «à la manière de Ruby», il est déroutant pour les programmeurs travaillant avec du code inconnu ou peu familier avec cette fonctionnalité de Ruby.
C'est un exemple un peu artificiel, mais imaginez avoir une petite fonction comme celle-ci, qui ajoute un au nombre passé et l'assigne à une variable d'instance.
def plus_one_to_y(x)
@y = x + 1
end
Était-ce censé être une fonction qui retournait une valeur, ou non? Il est vraiment difficile de dire ce que le développeur voulait dire, car il attribue à la fois la variable d'instance et renvoie également la valeur attribuée.
Supposons que beaucoup plus tard, un autre programmeur (peut-être pas très familier avec la façon dont Ruby effectue des retours basés sur la dernière ligne de code exécutée) arrive et veut mettre dans quelques instructions d'impression pour la journalisation, et la fonction devient ceci ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
end
Maintenant, la fonction est interrompue si quelque chose attend une valeur renvoyée . Si rien n'attend une valeur renvoyée, c'est bien. Clairement, si quelque part plus bas dans la chaîne de code, quelque chose qui appelle ceci attend une valeur renvoyée, il échouera car il ne récupère pas ce qu'il attend.
La vraie question est maintenant la suivante: est-ce que quelque chose s'attendait vraiment à une valeur renvoyée? Cela a-t-il cassé quelque chose ou pas? Va-t-il casser quelque chose dans le futur? Qui sait! Seul un examen complet du code de tous les appels vous le permettra.
Donc, pour moi au moins, la meilleure pratique consiste soit à être très explicite que vous renvoyez quelque chose si cela compte, soit à ne rien renvoyer du tout quand ce n'est pas le cas.
Donc, dans le cas de notre petite fonction de démonstration, en supposant que nous voulions qu'elle renvoie une valeur, elle s'écrirait comme ceci ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
return @y
end
Et il serait très clair pour tout programmeur qu'il renvoie une valeur, et beaucoup plus difficile pour eux de la casser sans s'en rendre compte.
Alternativement, on pourrait l'écrire comme ça et laisser de côté l'instruction return ...
def plus_one_to_y(x)
@y = x + 1
puts "In plus_one_to_y"
@y
end
Mais pourquoi se donner la peine d'omettre le mot retour? Pourquoi ne pas simplement le mettre là-dedans et expliquer à 100% ce qui se passe? Cela n'aura littéralement aucun impact sur la capacité de votre code à fonctionner.