我可以在Ruby中的begin / while语句中有一个块吗?

时间:2010-05-30 04:09:20

标签: ruby while-loop

我正在尝试在一段时间内使用一个块并在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 个答案:

答案 0 :(得分:6)

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