ruby - Ruby 中有条件的内联和有条件的 block 之间的区别

标签 ruby block conditional-statements

今天我遇到了 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/

相关文章:

android - Apache Cordova : how to block network access in config. xml

java - if-else-if梯形图的两个部分中的条件语句为true

ruby - Ruby 中的静态 block

ruby - 动态创建类方法

hadoop - 带 append 功能的 HDFS 是如何工作的

Python将C头文件转换为dict

c++ - 如何在等待前检测 pthread 条件信号?

Java扫描器多个/多个分隔符条件

ruby-on-rails - Ruby 简单表单复选框在 True 时不检查

ruby - ruby minitest 中可能出现 `assert_equal ... or assert_equal ...` 吗?