Ruby中的奇怪结果"end if"

And*_*y B 0 ruby

我希望这个代码执行的代码块,并导致产出"x""y",或只是抛出一个语法错误:

if true
  puts "x"
end if
puts "y"
Run Code Online (Sandbox Code Playgroud)

但是,解释器会忽略该if true块并仅执行puts "y".如果我改为输入以下代码:

if true
  puts "x"
end if
Run Code Online (Sandbox Code Playgroud)

解释器以输入结束语法错误退出.是否有一个原因,为什么第一个片段是有效的代码但不知何故执行错误?在我看来,解析器中存在一些错误.

我已经在Ruby 2.1.2以及Ruby 2.1.5中证实了这一点.

spi*_*ann 6

这里有两件事在一起玩:

  1. 返回值putsnil
  2. 如果当前命令尚未结束,Ruby通常足够聪明地读取下一行.

这意味着:

if true
  puts "x"
end if
puts "y"
Run Code Online (Sandbox Code Playgroud)

与以下相同:

if true
  puts "x"
end if (puts "y")
Run Code Online (Sandbox Code Playgroud)

Ruby评估puts "y"为nil:

if true
  puts "x"
end if nil
Run Code Online (Sandbox Code Playgroud)

什么导致Ruby不评估if true块,因为if nil行为就像if false.


或者换言之:您的示例与以下内容相同:

if puts("y") # evaluates to nil (aka is falsey)
  if true
    puts "x"
  end 
end
Run Code Online (Sandbox Code Playgroud)