今天我遇到了 Ruby 的内联 if 和阻塞 if 这种奇怪的行为
2.0.0-p247 :001 > inline_if = 'value will not set but no error' if inline_if
=> nil
2.0.0-p247 :002 > if block_if
2.0.0-p247 :003?> block_if = 'forget about setting value, I will raise an error'
2.0.0-p247 :004?> end
NameError: undefined local variable or method `block_if' for main:Object
from (irb):2
from /Users/myuser/.rvm/rubies/ruby-2.0.0-p247/bin/irb:13:in `<main>'
inline if conditional 和 block if conditional 有什么区别?
最佳答案
我怀疑它与 ruby 解析器有关。因为写内联 if 的时候
inline_if = 'value will not set but no error' if inline_if
Ruby 解析器实际上是从左到右解析的。所以在上一行它首先遇到了变量inline_if
的setter方法。所以它实际上用值定义了这个变量>
现在有了 if 条件 block
if block_if
block_if = 'forget about setting value, I will raise an error'
end
它首先尝试访问尚未定义的 block_if
变量。因此它会抛出一个错误。
令人惊奇的是,从程序员的角度来看,上述两个 block 应该被同等评估。但他们表现不同
关于ruby - Ruby 中有条件的内联和有条件的 block 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26943186/