while
- это ключевое слово, поэтому вам не нужен блок. Ваш код должен быть:
(1..limit).each { |i|
while (true)
x = n * (i%n)
puts n if n%i != 0
break if x.even? && !x.zero?
n += 1
end
}
Но вы запрашиваете блочную переменную из оператора while
. Имена переменных внутри каналов предназначены для переменных, передаваемых в ваш блок, содержащих информацию о любых вызовах вашего блока. Я предполагаю, что n
должен увеличиваться. Вот рабочая версия:
(1..limit).each { |i|
n = 0
while (true)
x = n * (i%n)
puts n if n%i != 0
break if x.even? && !x.zero?
n += 1
end
}
Если вам действительно нужен код в блоке, вы можете создать его, а затем вызвать его, например, так (только ruby 1.9):
(1..limit).each { |i|
n = 0
while (true)
-> do
x = n * (i%n)
puts n if n%i != 0
break if x.even? && !x.zero?
n += 1
end.()
end
}
Кстати, вот более чистая версия:
(1..limit).each do |i|
n = 0
loop do
x = n * (i % n)
puts n if n % i != 0
break if x.even? and !x.zero?
n += 1
end
end