2010-05-06 60 views
2

我该如何让Object#instance_of?接受多个参数,以便像下面的例子那样工作?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 

回答

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

我真的只是想通了这一点,你ANSW ered = /非常感谢您的快速回答! – RyanScottLewis 2010-05-06 03:58:03

3

如果你需要做的,有一次,肯的回答是要走的路。

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

如果你这样做了几次,虽然,有可能是别的事情上,即FooBar之间的共性,可以更加明确:

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

您也可以alias_method_chain现有instance_of?落实它与你想要的功能扩展:

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