2010-05-06 5 views
2

Как мне сделать Object#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

3

Если вам нужно сделать это один раз, ответ Кена это путь.

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

Если вы сделаете это несколько раз, хотя, может быть что-то еще, то есть общность между Foo и Bar, которые могут быть сделаны более явными:

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 
Смежные вопросы