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

0 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
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ian 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
}
Run Code Online (Sandbox Code Playgroud)

但是你要从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
}
Run Code Online (Sandbox Code Playgroud)

如果你真的需要一个块中的代码,你可以创建一个然后调用它,就像这样(仅限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
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是一个更清洁的版本:

(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
Run Code Online (Sandbox Code Playgroud)