条件“if”修饰符中的 Ruby 变量赋值
Posted
技术标签:
【中文标题】条件“if”修饰符中的 Ruby 变量赋值【英文标题】:Ruby variable assignment in a conditional "if" modifier 【发布时间】:2014-03-11 12:11:32 【问题描述】:我有一个关于 Ruby 解释器如何分配变量的问题:
我经常使用这个:
return foo if (foo = bar.some_method)
其中 some_method 返回一个对象或 nil。
但是,当我尝试这个时:
return foo if (true && (foo = bar.some_method))
我得到:NameError: undefined local variable or method foo for main:Object.
第一行和第二行的求值有什么不同导致第二行出错?
【问题讨论】:
因为在第二个变体中赋值会被短路。但是,嗯,我不确定这是一种有助于可读性的模式。 【参考方案1】:Read it carefully:
另一个容易混淆的情况是使用修饰符 if:
p a if a = 0.zero?
您会收到 NameError,“未定义的局部变量或方法 'a'”,而不是打印 true
。由于 Ruby 首先解析 if
左侧的裸露的 a
并且尚未看到对 a 的 assignment,因此它假定您希望调用一个方法。然后 Ruby 会看到 a
的 assignment 并假设您正在引用 local method
。
混淆来自于表达式的无序执行。 首先分配局部变量,然后尝试调用不存在的方法。
正如你所说 - 没有 return foo if (foo = bar.some_method)
和 return foo if (true && (foo = bar.some_method))
会起作用,我敢打赌,如果你没有在此行之前定义 foo
,它不会起作用。
【讨论】:
该死的我以为我删除了这个问题!我在发布后不久意识到,当我测试它时,我已经在 irb 中定义了 foo。我会把我的菜鸟的证据留给其他人学习。感谢您的回答。以上是关于条件“if”修饰符中的 Ruby 变量赋值的主要内容,如果未能解决你的问题,请参考以下文章