Подтвердить что ты не робот

Упростить несколько is_a? вызов объекта

Как переписать эту строку с помощью итератора?

actor.inspect if actor.is_a? Array || actor.is_a? Hash

Моя попытка не работать:

actor.inspect if [Array, Hash].each { |c| actor.is_a? c }
4b9b3361

Ответ 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

Usage

Usage
actor.is_any? Array, Hash

или

actor.is_any? [ Array, Hash ]