Динамическое изменение «каждого» цикла в Ruby - PullRequest
3 голосов
/ 09 января 2010

Я новичок в Ruby и столкнулся с проблемой, связанной с "каждым" циклом. Предположим, что код похож на следующий

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value
   if value>150 then endIndex=100
end

Когда я запускаю код, он будет работать до 200, а не до 150. Есть ли способ динамически изменить пределы диапазона цикла в Ruby?

Заранее спасибо за помощь

Tryskele

Ответы [ 5 ]

8 голосов
/ 09 января 2010

Почему не просто break?

(startIndex..endIndex).each do |value|
    p value
    break if value>=150
end

потому что это действительно плохая практика - динамически изменять пределы цикла.

3 голосов
/ 09 января 2010
startIndex= 1
endIndex= 200

range= (startIndex .. endIndex) # => 1..200

endIndex= 150
range # => 1..200

(a..b) создает объект класса Range.Объект Range не содержит указателей на передаваемые вами переменные.Он скорее содержит ссылки на объекты, на которые указывают переменные.Если вы измените переменную, чтобы переменная содержала ссылку на другой объект, Range по-прежнему будет содержать ссылку на старый объект.Таким образом, вы можете изменить диапазон, изменив сам объект.Но невозможно изменить Integer после его создания.

a= "abc"
b= "def"
range= (a..b) # => "abc".."def"
b.sub!("e", "$")
range # => "abc".."d$f"

Если единственное, что вы хотите сделать, это выйти из цикла, вы можете просто использовать break

(a..b).each do |v|
  break if something
end
2 голосов
/ 09 января 2010

Нет, то, что вы пытаетесь сделать, не сработает. Тем не менее, он также полностью не нужен, поскольку существует намного лучший идиоматичный способ сделать то же самое, что вы пытаетесь сделать:

p *(1..150)
0 голосов
/ 09 января 2010

Если вы просто хотите прекратить печать на 150, это может сработать.

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value if value <= 150
end

или

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value
   if value >= 150 
     break
   end
end
0 голосов
/ 09 января 2010

номер

Это почти наверняка не то, что вы хотите сделать.

Какую проблему вы пытаетесь решить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...