Il est de bon ton de renvoyer explicitement en Ruby?
À venir à partir d'un Python de fond, où il y a toujours une "bonne façon de le faire" (un "Pythonic manière de faire") quand il s'agit de style, je me demande si la même chose existe pour Ruby. J'ai été en utilisant mon propre style, mais je suis en train de penser au sujet de sortir de mon code source, et j'aimerais qu'il se conformer à l'une des règles non écrites qui pourraient exister.
Est-il "Le Rubis Façon" explicitement type return
dans les méthodes? Je l'ai vu faire avec et sans, mais est-il une bonne façon de le faire? Est-il peut-être un droit temps de le faire? Par exemple:
def some_func(arg1, arg2, etc)
# Do some stuff...
return value # <-- Is the 'return' needed here?
end
- C'est une très vieille question, mais pour ceux qui ont des questions similaires, Le livre Éloquent Ruby est fortement recommandé. Ce n'est pas un guide de style autant que d'une introduction à l'écriture idiomatique Ruby. Je souhaite que plus de gens le lire!
- Comme quelqu'un qui a hérité d'un grand héritage application qui a été développé en Ruby, j'ai beaucoup apprécié que vous avez posé cette question. Cela mérite un upvote. C'est parsemée tout au long de notre héritage app. Une de mes tâches de cette équipe est d'améliorer la base de code (dur quand étant nouveau pour Ruby).
Vous devez vous connecter pour publier un commentaire.
Vieux (et la "réponse") de la question, mais je vais jeter dans mes deux cents, à titre de réponse.
TL;DR - Vous n'avez pas à, mais il peut rendre votre code beaucoup plus clair dans certains cas.
Mais pas à l'aide d'un retour explicite peut être "le Rubis moyen", c'est source de confusion pour les programmeurs travaillant avec code inconnu, ou peu familiers avec cette fonctionnalité de Ruby.
C'est un peu artificiel exemple, mais l'imagerie d'avoir un peu de fonction comme celle-ci, qui additionne un nombre passé, et l'affecte à une variable d'instance.
Était-ce censé être une fonction qui a retourné une valeur, ou pas? Il est vraiment difficile de dire ce que signifiait le développeur, il assigne à la variable d'instance, ET renvoie la valeur affectée ainsi.
Suppose que beaucoup plus tard, un autre programmeur (peut-être pas familier avec la façon dont Ruby ne renvoie basée sur la dernière ligne de code exécutée) arrive et veut mettre dans certains des instructions d'impression, à l'exploitation, et la fonction devient ce...
Maintenant la fonction est cassé si quelque chose s'attend à une valeur retournée. Si rien ne s'attend à un retour de la valeur, c'est la fin. Clairement si, quelque part, plus loin dans le code de la chaîne, quelque chose de l'appel de cette s'attend à un retour de la valeur, c'est voué à l'échec car il n'est pas d'obtenir ce qu'elle attend.
La vraie question maintenant est: est-ce a fait quelque chose de vraiment s'attendre à un retour de la valeur? A ce casser quelque chose ou pas? Il va casser quelque chose dans l'avenir? Qui sait! Seule une révision du code de tous les appels vous permettra de savoir.
Donc, pour moi, au moins, la meilleure pratique est d'être très explicite sur le fait que vous êtes de retour quelque chose si il le faut, ou renvoyer rien s'il ne le fait pas.
Ainsi, dans le cas de notre petite démo de la fonction, en supposant que nous voulions pour retourner une valeur, il devrait être écrit comme cela...
Et il serait très clair pour tout programmeur qui retourne une valeur, et beaucoup plus difficile pour lui de rompre sans s'en rendre compte.
Alternativement, on pourrait écrire comme ça et de sortir l'instruction de retour...
Mais pourquoi s'embêter en laissant le mot de retour? Pourquoi ne pas simplement mettre en place et de le rendre 100% clair ce qui se passe? Il va littéralement n'ont aucun impact sur la capacité de votre code à exécuter.
return
ajoute de sens sémantique du code, pourquoi pas? Ce n'est pas très prolixe - nous ne parlons pas des 5 lignes vs 3, juste un mot de plus. Je préfère voirreturn
au moins dans les fonctions (peut-être pas dans les blocs) pour exprimer ce que le code fait réellement. Parfois, vous devez retourner à mi-fonction - ne pas laisser de côté la dernièrereturn
mot-clé sur la dernière ligne juste parce que vous le pouvez. Je ne suis pas en faveur de verbosité à tous, mais j'en faveur de la cohérence.side_effect()
et un autre développeur décide de (ab)utiliser l'implicite de la valeur de retour de votre procédure. Pour résoudre ce problème, vous pouvez faire vos procédures explicitementreturn nil
.#tap
pour éviter le retour,@y.tap { |value| puts value }
. Voir medium.com/aviabird/ruby-tap-that-method-90c8a801fd6aPas. Bon Ruby style généralement l'utilisation explicite retourne pour un retour anticipé. Ruby est grande sur le code minimalisme/implicite de la magie.
Cela dit, si un retour explicite permettrait de rendre les choses plus claires, ou plus facile à lire, il ne nuira pas à quoi que ce soit.
return
a déjà une importante signification sémantique comme un DÉBUT de SORTIE de la fonction.return
sur la dernière ligne de SORTIE ANTICIPÉE, de toute façon?Personnellement, j'utilise le
return
mot clé de distinguer entre ce que j'appelle fonctionnelle méthodes, c'est à dire des méthodes qui sont exécutés principalement pour leur valeur de retour, et méthodes procédurales qui sont exécutés principalement pour leurs effets secondaires. Ainsi, les méthodes dans laquelle la valeur de retour est important, obtenir un supplément dereturn
mot-clé pour attirer l'attention sur la valeur de retour.- Je utiliser la même distinction lorsque appel méthodes: les méthodes fonctionnelles obtenir des parenthèses, des méthodes procédurales ne pas.
Et le dernier mais non le moindre, j'utilise aussi cette distinction avec des blocs: les blocs fonctionnels d'obtenir des accolades, de la procédure de blocs (c'est à dire, des blocs de "faire" quelque chose) obtenir
do
/end
.Cependant, j'essaie de ne pas être religieux à ce sujet: avec des blocs, des accolades et
do
/end
ont différentes priorité, et plutôt que d'ajouter explicite entre parenthèses pour lever l'ambiguïté d'une expression, je viens de basculer de l'autre style. Il en va de même pour l'appel de méthode: si l'ajout de parenthèses autour de la liste de paramètres rend le code plus lisible, je le fais, même si la méthode en question est de nature procédurale.En fait l'important, c'est de faire la distinction entre:
Ruby n'est pas un natif de faire la distinction entre ces derniers - ce qui vous laisse vulnérables à l'écriture d'une procédure
side_effect()
et un autre développeur de décider de l'abus de l'implicite de la valeur de retour de votre procédure (essentiellement en la traitant comme un impur fonction).Pour résoudre ce problème, prendre une feuille de Scala, Haskell livre et avoir votre procédures renvoyer explicitement
nil
(akaUnit
ou()
dans d'autres langues).Si vous suivez cela, puis à l'aide explicite
return
syntaxe ou pas devient tout simplement une question de style personnel.Pour distinguer entre les fonctions et procédures:
do/end
()
, alors que lors de l'appel de fonctions, de ne pasNoter que Jörg W Mittag effectivement préconisé dans l'autre sens en évitant
()
s pour les procédures - mais ce n'est pas conseillé parce que vous voulez côté d'effectuer des appels de méthode pour se distinguer nettement de variables, en particulier lors de l'arité est de 0. Voir la Scala style guide sur l'invocation de méthode pour plus de détails.function_a
, etfunction_a
a été écrit à l'appel (et ne peut fonctionner que par l'appelant)procedure_b
, puis estfunction_a
vraiment une fonction? Elle renvoie une valeur, répondre à votre exigence pour les fonctions, mais il a un effet secondaire, tout en remplissant les exigences en matière de procédures.function_a
pourrait contenir un arbre deprocedure_...
appels, comme d'ailleursprocedure_a
pourrait contenir un arbre defunction_...
appels. Comme la Scala, mais à la différence de Haskell, il ne peut y avoir aucune garantie en Ruby qu'une fonction n'est pas du côté-accomplissement.Le guide de style unis, que vous ne devriez pas être à l'aide de
return
sur votre dernier relevé. Vous pouvez toujours l'utiliser si ce n'est pas le dernier. C'est l'une des conventions sur lesquelles la communauté suit strictement, et vous devriez faire si vous avez l'intention de collaborer avec n'importe qui à l'aide de Ruby.Cela étant dit, le principal argument pour l'utilisation explicite
return
s, c'est que c'est source de confusion pour les personnes venant d'autres langues.Une commune heuristique pour la méthode de la longueur (à l'exclusion des getters/setters) en java est un écran. Dans ce cas, vous pourriez ne pas voir que la définition de la méthode et/ou ont déjà oublié où vous étiez de retour d'.
D'autre part, en Ruby, il est préférable de s'en tenir à des méthodes moins de 10 lignes. Étant donné que, on pourrait se demander pourquoi il a écrire ~10% de plus d'états, lorsqu'ils sont clairement sous-entendue.
Depuis Ruby n'a pas vide méthodes et tout est beaucoup plus concis, vous êtes juste en ajoutant les frais généraux pour aucun des avantages si vous allez explicite
return
s.return
s fait du type de ce que vous êtes de retour plus facile à deviner.self
pour le chaînage.Je suis d'accord avec Ben Hughes et en désaccord avec Tim Holt, parce que la question mentionne le chemin définitif Python-t-il et vous demande si Ruby est une norme similaire.
Il n'.
C'est une caractéristique bien connue de la langue que quiconque devrait déboguer un problème dans le rubis raisonnablement censé le savoir.
return
mot clé lors de l'inutile.import this
).C'est une question de style que vous préférez, pour la plupart. Vous devez utiliser le mot-clé return si vous souhaitez revenir de quelque part au moyen d'une méthode.
Comme dit Ben. Le fait que "la valeur de retour d'une méthode ruby est la valeur de retour de la dernière instruction dans le corps de la fonction" provoque le mot-clé return être rarement utilisé dans la plupart des méthodes ruby.
if failed_check then nil else @list end
? C'est vraiment fonctionnel.return
à la fin de votre méthode. Si vous ne voulez pas explicitereturn
à la fin, puis le faire à ma façon. Être cohérent.