语法错误,意外的keyword_do_block

时间:2014-08-10 04:10:57

标签: ruby

我有代码:

i = 1
while i < 11 
  do
  end
  print "#{i}"
  i = i + 1
end

导致错误“在线do:语法错误,意外的keyword_do_block”。如果我在do之后移动while while i < 11 do,则错误就会消失。它不应该发生,因为do就像一个大括号{。为什么这是一个错误?

4 个答案:

答案 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通常用于多行,而{}用于一行代码。

根据Ruby cookbook

  

请记住,括号语法的优先级高于do..end语法。请考虑以下两段代码:

更多信息: Using do block vs braces {}

答案 3 :(得分:0)

这里你实际上有2个问题。

  • Ruby的do-end语法,你好像已经发现了

以下是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,但我不确定这个问题的重点。

  • 你最后有一个额外的结束声明