Несколько instance_of? - PullRequest
3 голосов
/ 06 мая 2010

Как мне заставить 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

Ответы [ 3 ]

8 голосов
/ 06 мая 2010
[Foo,Bar].any? {|klass| my_foo.instance_of? klass}
2 голосов
/ 06 мая 2010

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

[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 голосов
/ 06 мая 2010

Вы также можете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...