2010-05-06 7 views
2

Comment devrais-je faire Object#instance_of? accepter plusieurs arguments afin que quelque chose comme l'exemple ci-dessous fonctionne?Multiple instance_of?

class Foo; end 
class Bar; end 
class Baz; end 

my_foo = Foo.new 
my_bar = Bar.new 
my_baz = Baz.new 

my_foo.instance_of?(Foo, Bar) # => true 
my_bar.instance_of?(Foo, Bar) # => true 
my_baz.instance_of?(Foo, Bar) # => false 

Répondre

6
[Foo,Bar].any? {|klass| my_foo.instance_of? klass} 
+0

J'ai littéralement compris cela comme vous répondez Merci =/Merci beaucoup pour la réponse rapide! – RyanScottLewis

3

Si vous devez faire une fois, la réponse de Ken est le chemin à parcourir.

[Foo,Bar].any? {|klass| my_foo.instance_of? klass} 

Si vous faites cela deux ou trois fois cependant, il pourrait y avoir quelque chose d'autre à faire, à savoir un point commun entre Foo et Bar qui peut être plus explicite:

module Foobarish; end 
class Foo 
    include Foobarish 
end 
class Bar 
    include Foobarish 
end 
class Baz; end 

Foo.new.kind_of? Foobarish # => true 
Bar.new.kind_of? Foobarish # => true 
Baz.new.kind_of? Foobarish # => false 
0

Vous pouvez également alias_method_chain l'implémentation existante instance_of? pour l'étendre avec la fonctionnalité désirée:

>> Object.class_eval do 
>? def instance_of_with_multiple_arguments(*arguments) 
>>  arguments.any? { |klass| instance_of_without_multiple_arguments(klass) } 
>> end 
>> 
>> alias_method :instance_of_without_multiple_arguments, :instance_of? 
>> alias_method :instance_of?, :instance_of_with_multiple_arguments 
>> end