我有以下代码
# 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'和多行'
为什么我不这样做?那我该怎么办?
答案 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
,它仍然按照您要求的方式运行,不会抛出任何错误而只是一个警告。但是,如果您尝试将Proc
或Method
对象传递给它,并使用 {{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_proc
是loop
方法,它采用块。 块引入了新的局部变量范围。
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