8
votes

Ruby: cas à l'aide de l'objet

existe-t-il un moyen d'appeler implicitement des méthodes sur l'objet d'une déclaration de cas? C.-à-don: xxx

Qu'est-ce que j'aimerais pouvoir faire est quelque chose comme ça ... xxx

... 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 ...


0 commentaires

4 Réponses :


8
votes

Quel cas. Lorsque est-il appelle la méthode === sur votre lorsque valeurs, passez votre FOO < / Code> Objet comme argument sur la méthode === . Donc, dans ce code: xxx

Il essaiera 1 === foo , puis 2 === foo , puis 3 === foo , jusqu'à ce que l'un d'entre eux retourne une valeur de contrôle.

une façon de faire cas. Lorsque plus puissant utilise des procs comme le Lorsque valeurs. Je ne suis pas sûr des versions antérieures de Ruby, mais en 1.9, proc === x équivaut à proc.c.call (x) . Afin que vous puissiez écrire du code comme celui-ci: xxx

Notez que nous n'avons même pas à passer foo 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: xxx


3 commentaires

Le comportement === 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 suggestion. Cela ne ressemble pas à un endroit approprié pour case 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!



4
votes

On dirait que vous souhaitez modifier le récepteur par défaut. C'est un hacky, mais vous pourriez faire quelque chose comme: xxx

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.


0 commentaires

10
votes

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


3 commentaires

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.



3
votes

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"


0 commentaires