我有代码:
i = 1
while i < 11
do
end
print "#{i}"
i = i + 1
end
导致错误“在线do:语法错误,意外的keyword_do_block”。如果我在do
之后移动while
while i < 11 do
,则错误就会消失。它不应该发生,因为do
就像一个大括号{
。为什么这是一个错误?
答案 0 :(得分:7)
因为do
仅对while
是可选的,如果您将其放在不同的行上,它已经被读作不同背景的一部分:
while conditional [do]
code
end
此处,while
语句仍然有效且do
不再连接到您看到错误的原因。
while conditional ## Parser validates this as complete.
do ## Parser sees this keyword as lost.
code
end
就好像你没有while
块一样:
do ## Lost.
code
这也会产生错误syntax error, unexpected keyword_do_block
。
为了更清楚地说明一点,在尝试识别以下while
时,do
语法不是多行的。这可能有效:
while conditional do
code
end
还有这个:
while conditional \
do
code
end
但有问题的表格不会。
答案 1 :(得分:1)
应该是:
$i = 0
while $i < 11 do
puts("Inside the loop i = #$i" )
$i +=1
end
答案 2 :(得分:0)
关键字do通常用于多行,而{}用于一行代码。
请记住,括号语法的优先级高于do..end语法。请考虑以下两段代码:
答案 3 :(得分:0)
这里你实际上有2个问题。
以下是ruby doc的参考资料 http://ruby-doc.org/core-2.1.2/doc/syntax/control_expressions_rdoc.html
while Loop¶ ↑
The while loop executes while a condition is true:
a = 0
while a < 10 do
p a
a += 1
end
p a
Prints the numbers 0 through 10. The condition a < 10 is checked before the loop is entered, then the body executes, then the condition is checked again. When the condition results in false the loop is terminated.
The do keyword is optional. The following loop is equivalent to the loop above:
while a < 10
p a
a += 1
end
关于“为什么”选择这种语法,你需要询问Matz,但我不确定这个问题的重点。