Ruby将If语句转换为Case

时间:2010-01-19 10:57:58

标签: ruby case switch-statement if-statement

是否可以使用case语句来替换这些if语句?

if (a%3 == 0) then puts "%3"
elsif (a%4 == 0) then puts "%4"
elsif (a%7 == 0 && a%13 == 0) then puts "%%"

5 个答案:

答案 0 :(得分:6)

case
  when (a % 3).zero? then puts "%3"
  when (a % 4).zero? then puts "%4"
  when (a % 7).zero? && (a % 13).zero? then puts "%%"
end

答案 1 :(得分:3)

不确定

case
when (a%3 == 0) then puts "%3"
when (a%4 == 0) then puts "%4"
when (a%7 == 0 && a%13 == 0) then puts "%%"
end

这不是更好,是吗? ; - )

答案 2 :(得分:2)

puts [3,4,91,10].collect do |a|
 case 0
 when a % 3 then
  "%3"
 when a % 4 then
  "%4"
 when a % 91 then
  "%%"
 end
end

您应该能够将该权利复制到irb中以使其正常工作。请原谅轻微的7 * 13 = 91 hack,但如果你正在使用实际的模数,它们应该是等价的。

答案 3 :(得分:1)

使用Proc#===

def multiple_of( factor )
  lambda{ |number| number.modulo( factor ).zero? }
end

case a
  when multiple_of( 3 ): puts( "%3" )
  when multiple_of( 4 ): puts( "%4" )
  when multiple_of( 7*13 ): puts( "%%" )
end

答案 4 :(得分:0)

(a%7 == 0&& a%13 == 0)等于(a%7 * 13 == 0)。

在ruby中,你可以使用1行if-else语句使用&&和||。

puts (a%3 == 0)&&"%3"||(a%4 == 0)&&"%4"||(a%(7*13) == 0)&&"%%"||""

log = (a%3 == 0)&&"%3"||(a%4 == 0)&&"%4"||(a%(7*13) == 0)&&"%%"
puts log if log

看起来非常简短。