actor.inspect if actor.is_a? Array || actor.is_a? Hash
Моя попытка не работать:
actor.inspect if [Array, Hash].each { |c| actor.is_a? c }
Ответ 1
Если вы хотите сопоставить точные классы (а не потомки), вы можете использовать:
[Hash, Array].member? a.class
Я думаю, вы должны объяснить, что именно вам нужно достичь. Возможно, единственное, что вам нужно проверить, это то, что ваш объект является Enumerable или нет, или даже если он respond_to? какой-то конкретный метод.
Ответ 2
Вы ищете Array#any?
actor.inspect if [Array, Hash].any? { |c| actor.is_a? c }
#each обычно просто возвращает перечислимый. #any? или вместе результат результата блоков.
Ответ 3
Используйте .include?
Вместо того, чтобы использовать .is_a? для типа класса, вы также можете поместить все классы в Array и затем посмотреть, включен ли класс объектов в этот Array, например:
[ Array, Hash ].include?( actor.class )
ПРИМЕЧАНИЕ. Это не будет проверять подтипы, как is_a?.
Ответ 4
Создайте метод is_any?.
Если вы делаете это часто, лучше всего создать инициализатор (или любой файл, который загружается, если вы не используете Rails), который добавляет новый метод с именем is_any? в Object.
Initializer
config/initializers/is_any.rb
class Object
def is_any?( *klasses ) # Using the splat and flatten allows this to accept
klasses.flatten.any? do |klass| # both comma separated params as well as an Array.
self.is_a?( klass )
end
end
end