existe-t-il un moyen d'appeler implicitement des méthodes sur l'objet d'une déclaration de cas?
C.-à-don: Qu'est-ce que j'aimerais pouvoir faire est quelque chose comme ça ... p> ... où le "Quand" Les déclarations évaluent le retour des méthodes sur l'objet de cas. Une certaine structure est-elle comme cela possible? Je n'ai pas été en mesure de comprendre la syntaxe si ... p> p>
4 Réponses :
Quel Il essaiera une façon de faire Notez que nous n'avons même pas à passer cas. Lorsque code> est-il appelle la méthode
=== code> sur votre
lorsque code> valeurs, passez votre
FOO < / Code> Objet comme argument sur la méthode
=== code>. Donc, dans ce code:
1 === foo code>, puis
2 === foo code>, puis
3 === foo code>, jusqu'à ce que l'un d'entre eux retourne une valeur de contrôle. P>
cas. Lorsque code> plus puissant utilise des procs comme le
Lorsque code> valeurs. Je ne suis pas sûr des versions antérieures de Ruby, mais en 1.9,
proc === x code> équivaut à
proc.c.call (x) code>. Afin que vous puissiez écrire du code comme celui-ci: p>
foo code> dans le processus, car nous avons déjà accès à cela. Je ne pense pas que ce soit un très bon choix de structure de contrôle pour cet exemple, une simple chaîne d'IFS aurait plus de sens: p>
Le comportement === code> pour ProC est une chose 1.9, il n'y en a aucune mention dans le 1.8.7 docs mais il y a dans le 1.9 Docs .
+1 pour si code> suggestion. Cela ne ressemble pas à un endroit approprié pour
case code> pour commencer, imo.
Merci pour la réponse détaillée, c'était une lecture utile. J'étais vraiment déchiré entre votre réponse et Hellodally - votre est plus informatif dans l'ensemble, mais c'est ce que je vais réellement finir par utiliser. Étant donné que c'était essentiellement un coup de pouce, je lui ai donné la réponse depuis que son représentant est d'environ 25 000 de moins que le vôtre :) Merci pour l'explication minutieuse cependant!
On dirait que vous souhaitez modifier le récepteur par défaut. C'est un hacky, mais vous pourriez faire quelque chose comme: C'est une grosse odeur de code terrible, si vous le faites simplement parce que vous êtes paresseux. Si vous le faites parce que vous créez une DSL, c'est autre chose. P> P>
FWIW, vous n'avez pas besoin de transmettre un objet à une déclaration de cas dans 1.8.7 du tout.
foo = Foo.new() case when foo.bar == this then that when foo.baz == this then that end
Je pense que c'est la chose la plus proche de ce que je veux. Merci :)
Oh, soigné! Je ne le savais pas. Étant donné que, vous pouvez le combiner avec instance_exec (voir ma réponse) pour obtenir presque exactement ce que vous avez décrit dans la question.
Andrew, pas de sueur. Ian, vrai ça.
Pour différents scénarios où vous souhaitez tester la valeur de la méthode de la véracité d'un objet
class Foo def approved? false end def pending? true end end foo = Foo.new case foo when :approved?.to_proc puts 'Green' when :pending?.to_proc puts 'Amber' else puts 'Grey' end # This will output: "Amber"