Могу ли я иметь блок в выражении begin / while в Ruby? - PullRequest
0 голосов
/ 30 мая 2010

Я пытаюсь получить блок и начать операторы в Ruby, но я получаю синтаксическую ошибку. Есть ли другой способ реализовать это?

Вот что я хочу сделать

(1..limit).each { |i|
  while (true) do |n|
    x = n * (i%n)
    puts n if n%i != 0
    break if x.even? && !x.zero?
    n += 1
  end
}

1 Ответ

6 голосов
/ 30 мая 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...