简化多个is_a?调用对象

时间:2010-07-06 15:26:13

标签: ruby

如何使用迭代器重写此行?

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

我的尝试不起作用:

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

4 个答案:

答案 0 :(得分:12)

如果要匹配确切的类(而不是后代),可以使用:

[Hash, Array].member? a.class

我认为您应该解释一下您需要实现的目标。也许你需要检查的唯一事情是你的对象是否是Enumerable,或者是respond_to?某种特定的方法。

答案 1 :(得分:8)

您正在寻找Array#any?

actor.inspect if [Array, Hash].any? { |c| actor.is_a? c }

#each通常只返回可枚举数。 #any?将块的结果放在一起。

答案 2 :(得分:0)

使用.include?

您也可以将所有类放在.is_a?中,而不是使用Array作为类类型,然后查看对象的类是否包含在该Array中,例如:< / p>

[ Array, Hash ].include?( actor.class )

注意:这不会像is_a?那样检查子类型。

答案 3 :(得分:0)

创建一个is_any?方法。

如果您经常这样做,那么最好创建一个初始化程序(或者如果不使用Rails则加载任何文件),然后将一个is_any?新方法添加到{{1} }。

初始化器

Object

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

actor.is_any? Array, Hash