如何使用`is_a?`检查单独的类?

时间:2016-02-27 22:37:28

标签: ruby

我正在尝试定义一个方法,如果数组包含字符串或数字,则返回true。我想要这个方法返回:

a = [ 1, 2, 3, "string" ]
any_strings_or_numbers?(a)
#=> true

b = [ "no numbers" ]
any_strings_or_numbers?(b)
#=> true

c = [ 1.0 ]
any_strings_or_numbers?(c)
#=> true

c = [ ]
any_strings_or_numbers?(c)
#=> false

这是我尝试过的,但它不起作用:

def any_strings_or_numbers?(a)
  a.any? {|num| num.is_a?(String || Integer) }
end

3 个答案:

答案 0 :(得分:2)

你错过了ruby中有几个数字类。

1.class 
# => Fixnum

(2**65).class
# => Bignum

1.0.class
# => Float

所有数字的超类都是Numeric。所以你可能想知道对象是Numeric还是String的子类的实例。

def any_strings_or_numbers?(a)
  a.any? {|x| x.kind_of?(String) || x.kind_of?(Numeric) }
end

答案 1 :(得分:1)

def any_strings_or_numbers?(a)
  a.any? {|num| case num; when String, Integer then true; end}
end

答案 2 :(得分:-1)

首先,你会得到任何元素是的实例还是所有元素都是的实例?在大多数现实生活中我们检查所有元素,我只是好奇,可能是你的情况特别:)让我建议这样:

collection.any? do |element|
  [String, Numeric].any? { |klass| element.is_a? klass }
end

通过这种方式,可以轻松添加更多可能的类,参数化白名单或提取验证方法。

PS。如果您需要所有元素作为白名单中类的实例,而不是使用 all?进行顶级迭代。