【问题标题】:Ruby Convert If Statements to CaseRuby 将 If 语句转换为大小写
【发布时间】:2010-01-19 10:57:57
【问题描述】:

是否可以使用 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 "%%"

【问题讨论】:

  • 也许吧,但它不再可读了。你为什么要这样做?

标签: ruby case switch-statement if-statement


【解决方案1】:
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

【讨论】:

  • 不对,当它不属于其中一种情况时,它会打印'Nil',这不是原始代码所做的。
  • 你是对的。只需将 puts 移到 case 语句中。我相应地改变了答案。
【解决方案2】:

当然:

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

也好不到哪里去,是吗? ;-)

【讨论】:

    【解决方案3】:
    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,但如果您使用实际模数,它们应该是等效的。

    【讨论】:

      【解决方案4】:

      使用 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
      

      【讨论】:

        【解决方案5】:

        (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
        

        它看起来很灵巧但很短。

        【讨论】:

          猜你喜欢
          • 2011-10-29
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 2023-03-13
          • 2023-04-08
          • 2014-10-08
          • 1970-01-01
          相关资源
          最近更新 更多