Rubocop规则:永远不要使用'do'与多行'

时间:2014-01-22 17:45:30

标签: ruby while-loop rubocop

我有以下代码

  # colours a random cell with a correct colour
  def colour_random!
    while true do
      col, row = rand(columns), rand(rows)
      cell = self[row,col]
      if cell.empty? then
        cell.should_be_filled? ? cell.colour!(1) : cell.colour!(0)
        break
      end
    end
  end
尽管它应该非常明显,但它的重要性并不重要。关键是Rubocop给了我一个警告

  

时不要使用'do'和多行'

为什么我不这样做?那我该怎么办?

2 个答案:

答案 0 :(得分:16)

while是关键字,因此您无需传递数据块。如果没有do..end,它将正常工作。以下是好的

  def colour_random!
    while true
      col, row = rand(columns), rand(rows)
      cell = self[row,col]
      if cell.empty? then
        cell.should_be_filled? ? cell.colour!(1) : cell.colour!(0)
        break
      end
    end
  end

while 是一个关键字,如果您将一个块传递给它,例如do..end,它仍然按照您要求的方式运行,不会抛出任何错误而只是一个警告。但是,如果您尝试将ProcMethod对象传递给它,并使用 {{1}动态尝试将其转换为,则可能会有危险正如我们一般所做的那样,关键字。这意味着

&

但如果你试图像下面那样做错误

# below code will work as expected just throwing an warning.
x = 2
while x < 2 do
  #code
end

原因是while &block # booom!! error 是一个关键字,不支持任何while方法来满足您的需求。所以可能很危险

Ruby样式指南还建议Never use while/until condition do for multi-line while/until

我认为原因是因为 Nobuyoshi Nakada mailing list中说了

to_procloop方法,它采用引入了新的局部变量范围

kernel

loop do a = 1 break end p a #=> causes NameError 没有。

while

答案 1 :(得分:4)

Ruby实际上有while true的快捷方式:the loop statement

def colour_random!
  loop do
    col, row = rand(columns), rand(rows)
    cell = self[row,col]
    if cell.empty? then
      cell.should_be_filled? ? cell.colour!(1) : cell.colour!(0)
      break
    end
  end
end