【问题标题】:how to use ruby " case ... when " with inequalities?如何在不等式中使用红宝石“ case ... when”?
【发布时间】:2011-02-25 07:09:41
【问题描述】:

你能在 ruby​​ 中做到这一点吗? 它似乎“错过”了不平等的情况

 case myvar
 when  myvar < -5
    do somethingA
 when -5..-3
    do special_something_XX
 when -2..-1
    do special_something_YY
 when myvar == 0
    do somethingB
 when myvar > 0
    go somethingC
 end

【问题讨论】:

  • 您可以使用正则表达式来捕获不同的情况
  • @Flexo:你的方法会处理科学记数法吗?

标签: ruby switch-statement


【解决方案1】:

您混合了两种不同类型的 case 语句:

case var
when 1
  dosomething
when 2..3
  doSomethingElse
end

case
when var == 1
   doSomething
when var < 12
   doSomethingElse
end

【讨论】:

  • 谢谢,对我这个相对新手很有帮助!
  • 哇,我一直没有意识到第二种类型的存在。谢谢。
  • eli5 写满了!我最喜欢的解释:)
【解决方案2】:
   case myvar
     when  proc { |n| n < -5 }
        do somethingA
     when -5..-3
        do special_something_XX
     when -2..-1
        do special_something_YY
     when proc { |n| n == 0 }
        do somethingB
     when proc { |n| n > 0 }
        go somethingC
     end
   end

【讨论】:

  • 一些解释和链接会很好。
【解决方案3】:

我个人并不认为使用 if 语句会更好,但如果您想要这种形式的解决方案:

Inf = 1.0/0

case myvar
when -Inf..-5
  do somethingA
when -5..-3
  do special_something_XX
when -2..-1
  do special_something_YY
when 0
  do somethingB
when 0..Inf
  do somethingC
end

我的首选解决方案如下。这里的顺序很重要,您必须重复myvar,但要省略案例要困难得多,您不必重复每个绑定两次,并且严格性(&lt; vs &lt;= 而不是.. vs ...) 更明显。

if myvar <= -5
  # less than -5
elsif myvar <= -3
  # between -5 and -3
elsif myvar <= -1
  # between -3 and -1
elsif myvar <= 0
  # between -1 and 0
else
  # larger than 0
end

【讨论】:

  • 我个人认为使第二种选择更清晰的是 cmets,而不是使用 if-elsif 代替 case-when 的事实。也就是说,我也更喜欢 if-elsif,但只是因为它更短。
【解决方案4】:
def project_completion(percent)
 case percent
  when  percent..25
    "danger"
  when percent..50
    "warning"
  when percent..75
    "info"
  when percent..100
    "success"
  else
   "info"
  end
end

【讨论】:

  • 这种方式看起来有点骇人听闻,可能会导致percent 与自己进行多次比较。 case / when percent &lt;= 25 / ... 似乎更好(代码更少/效率更高)。 percent 是否是比较的焦点并不一定那么清楚,但我认为通过查看 when 表达式很容易看出这一点。
【解决方案5】:

使用infinity 可能会有所帮助

case var
when -Float::INFINITY..-1
when 0
when 1..2
when 3..Float::INFINITY
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多