嗯,有一个case 声明:
case num
when 1,2,3,4
puts "it's ok"
else
puts "it's not ok"
end
例如:
[0, 1, 4, 5].each do |num|
case num
when 1,2,3,4
puts "#{num} is ok"
else
puts "#{num} is not ok"
end
end
# >> 0 is not ok
# >> 1 is ok
# >> 4 is ok
# >> 5 is not ok
或者有点干燥:
[0, 1, 4, 5].each do |num|
puts case num
when 1,2,3,4
"#{num} is ok"
else
"#{num} is not ok"
end
end
# >> 0 is not ok
# >> 1 is ok
# >> 4 is ok
# >> 5 is not ok
而且,由于when 允许范围,您可以改用when 1 .. 4。
虽然我很欣赏显示使用 case 最快的基准测试结果,但这没有意义,因为 Casper 应该是这样。这是我发现的:
require 'fruity'
n = 1
compare do
casper1 { n < 1 || n > 4 }
casper2 { n >= 1 && n <= 4 }
casper3 { 1 <= n && n <= 4 }
sagarpandya82 {n.between?(1,4)}
spickerman {(1..4).cover?(n)}
reitermarkus {[1, 2, 3, 4].include?(n)}
ttm {case n;when 1,2,3,4;true;else;false;end}
end
# >> Running each test 262144 times. Test will take about 11 seconds.
# >> casper2 is similar to casper3
# >> casper3 is faster than ttm by 2x ± 1.0
# >> ttm is faster than casper1 by 2x ± 1.0 (results differ: true vs false)
# >> casper1 is faster than sagarpandya82 by 3x ± 1.0 (results differ: false vs true)
# >> sagarpandya82 is similar to spickerman
# >> spickerman is faster than reitermarkus by 2x ± 0.1
在多次运行中,casper2 和 casper3 将交替成为最快和次快,然后在ttm 中使用case。
结果会随着更多值的添加而改变。特别是,我认为include 和when 1,2,3,4 测试会受到严重影响。
只是为了表明没有必要折叠空格,或者换句话说,空格没有任何区别:
require 'fruity'
n = 1
compare do
ttm1 {case n;when 1,2,3,4;true;else;false;end}
ttm2 {case n; when 1,2,3,4; true; else; false; end}
ttm3 {
case n
when 1,2,3,4
true
else
false
end
}
end
# >> Running each test 131072 times. Test will take about 2 seconds.
# >> ttm1 is similar to ttm3
# >> ttm3 is similar to ttm2
使用 Fruity,当您看到这些“类似于”结果时,它们往往会按顺序交替出现,因为速度差异通常是测试期间系统抖动的结果。
最后,比较when 1,2,3,4 和when 1..4:
require 'fruity'
n = 1
compare do
ttm1 {
case n
when 1,2,3,4
true
else
false
end
}
ttm2 {
case n
when 1..4
true
else
false
end
}
end
# >> Running each test 131072 times. Test will take about 2 seconds.
# >> ttm1 is faster than ttm2 by 8x ± 10.0