web-dev-qa-db-fra.com

comment utiliser Ruby "cas ... quand" avec des inégalités?

pouvez-vous faire cela en rubis? il semble "manquer" les cas d'inégalités

 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
49
jpwynn

Vous mélangez deux types différents de déclarations de cas:

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

case
when var == 1
   doSomething
when var < 12
   doSomethingElse
end
99
toolkit
   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
26

Je ne suis pas personnellement convaincu que vous ne feriez pas mieux de faire des déclarations if, mais si vous voulez une solution sous cette forme:

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

Ma solution préférée suit. Ici, l'ordre est important et vous devez répéter le myvar, mais il est beaucoup plus difficile de laisser de côté les cas, vous n'avez pas à répéter chaque borne deux fois, et la rigueur (< contre <= plutôt que .. contre ...) est beaucoup plus évident.

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
7
Peter
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
4
Majid Mushtaq

Utiliser infini peut aider

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