2010-05-06 106 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