如何使用case语句并检查两个条件?
我需要检查项目是否为数组,并且仅包含字符串类。
a = ['one','twon'] # => ["one", "twon"]
case a # =>
when String
puts "string
when Array && a.all?{|obj| obj.is_a?(String) }
puts 'an array with only string classes'
else
raise ArgumentError, "unsupported object #{obj}:#{obj.class}"
end
上面的代码应该返回“ C0”的情况,当它应该返回“只有字符串类的数组”语句时
else
语句中的条件不是布尔表达式;它们是使用case
运算符与目标对象进行比较的值。当然,任何类都可以重写该运算符,但是预定义的运算符仅在少数条件下返回true(例如===
等价于,包含在is_a?
...中)。如果布尔表达式为=~
条件,则该表达式为true时不会触发匹配。当目标对象when
为表达式的值时,它将触发匹配,对于大多数对象,===
本身不是true。
因此,在这种情况下,您可能想将obj === true
换成case
/ if
链:
else
或在案例条件内进行嵌套检查:
if a.is_a? String
puts "string"
elsif a.is_a?(Array) && a.all? { |obj| obj.is_a? String }
puts 'an array with only string classes'
else
raise ArgumentError, "unsupported object #{a}:#{a.class}"
end