我希望这个代码执行的代码块,并导致产出"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中证实了这一点.
这里有两件事在一起玩:
puts是nil这意味着:
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)