Ответ 1
Вы смешиваете два разных типа операторов case:
case var
when 1
dosomething
when 2..3
doSomethingElse
end
case
when var == 1
doSomething
when var < 12
doSomethingElse
end
можете ли вы сделать это в рубине? он, кажется, "пропускает" случаи с неравенствами
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
Вы смешиваете два разных типа операторов case:
case var
when 1
dosomething
when 2..3
doSomethingElse
end
case
when var == 1
doSomething
when var < 12
doSomethingElse
end
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
Я лично не уверен, что вам лучше не работать с операторами 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
, но гораздо труднее не учитывать случаи, вам не нужно повторять каждую привязку дважды, а строгость (<
vs <=
, а не ..
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
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
Использование infinity может помочь
case var
when -Float::INFINITY..-1
when 0
when 1..2
when 3..Float::INFINITY
end