Мне нужно написать цикл, который делает что-то вроде:
if i (1..10)
do thing 1
elsif i (11..20)
do thing 2
elsif i (21..30)
do thing 3
etc...
Но до сих пор сменились неправильные пути в терминах синтаксиса.
Мне нужно написать цикл, который делает что-то вроде:
if i (1..10)
do thing 1
elsif i (11..20)
do thing 2
elsif i (21..30)
do thing 3
etc...
Но до сих пор сменились неправильные пути в терминах синтаксиса.
if i.between?(1, 10) do thing 1 elsif i.between?(11,20) do thing 2 ...
Используйте оператор ===
(или его синоним include?
)
if (1..10) === i
Как сказал @Baldu, используйте оператор === или использовать case/, когда он использует ===:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
если вы все еще хотите использовать диапазоны...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Обычно вы можете получить гораздо лучшую производительность с чем-то вроде:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Не прямой ответ на вопрос, но если вы хотите, чтобы противоположность "внутри":
(2..5).exclude?(7)
True
Вы можете использовать
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
и в соответствии с этим эталоном в Fast Ruby быстрее, чем include?
Более динамичный ответ, который можно построить в Ruby:
def select_f_from(collection, point)
collection.each do |cutoff, f|
if point <= cutoff
return f
end
end
return nil
end
def foo(x)
collection = [ [ 0, nil ],
[ 10, lambda { puts "doing thing 1"} ],
[ 20, lambda { puts "doing thing 2"} ],
[ 30, lambda { puts "doing thing 3"} ],
[ 40, nil ] ]
f = select_f_from(collection, x)
f.call if f
end
Итак, в этом случае "диапазоны" на самом деле просто огорожены нулями, чтобы поймать граничные условия.
Для строк:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# = > True