как использовать рубин "случай ... когда" с неравенствами - PullRequest
49 голосов
/ 25 февраля 2011

вы можете сделать это в рубине?похоже, «пропускают» случаи с неравенствами

 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

Ответы [ 5 ]

97 голосов
/ 25 февраля 2011

Вы смешиваете два разных типа падежных операторов:

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

case
when var == 1
   doSomething
when var < 12
   doSomethingElse
end
26 голосов
/ 11 декабря 2012
   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
7 голосов
/ 25 февраля 2011

Лично я не убежден, что вам было бы лучше с утверждениями 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, но гораздо сложнее пропустить случаи, вам не нужно повторять каждую границу дважды, и строгость (< против <= вместо ..против ...) гораздо более очевидно.

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
4 голосов
/ 11 декабря 2014
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
1 голос
/ 02 августа 2016

Использование бесконечность может помочь

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