如何使用迭代器重写此行?
actor.inspect if actor.is_a? Array || actor.is_a? Hash
我的尝试不起作用:
actor.inspect if [Array, Hash].each { |c| actor.is_a? c }
答案 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