4
x='bob'
case x
when "bob"
puts 'it stops here'
when 'bob'
puts 'but i want it to stop here'
end

反正有没有让 case 语句表现得像 vanilla 开关?这样它会在爆发之前循环遍历所有“何时”?我很惊讶 ruby​​ 的行为几乎与elsif.

4

2 回答 2

8

迈克尔,

虽然你的例子有点误导('bob' 匹配 'bob' 和 "bob" 所以第一个案例总是匹配),你可以使用简单的 if 就像if_test下面的方法:

def case_test(x)                                                  
  puts case
  when x > 3
    "ct: #{x} is over 3"
  when x > 4
    "ct: #{x} is over 4"
  end   
end     

case_test(4)
case_test(5)

def if_test(x)
  puts "it: #{x} is over 3" if x > 3
  puts "it: #{x} is over 4" if x > 4
end     

if_test(4)
if_test(5)

这产生:

ct: 4 is over 3
ct: 5 is over 3
it: 4 is over 3
it: 5 is over 3
it: 5 is over 4

请注意,您还可以使用多个语句 with when,这可能对您有所帮助,具体取决于您的实际用例:

def many(x)              
  case x                 
  when 'alice','bob'     
    puts "I know #{x}"
  else·                  
    puts "I don't know #{x}"                                      
  end                    
end                      

many('alice')            
many('bob') 
many('eve')

产量:

I know alice
I know bob
I don't know eve
于 2012-05-25T18:44:40.113 回答
3

不,Case 语句在通过比较时评估when其目标===方法评估的第一个块true,然后停在那里。

于 2012-05-25T18:37:17.360 回答