Ruby:Case语句中的两个条件

问题描述 投票:0回答:1

如何使用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”的情况,当它应该返回“只有字符串类的数组”语句时

ruby-on-rails ruby ruby-on-rails-5
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.