条件“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 会看到 aassignment 并假设您正在引用 local method

混淆来自于表达式的无序执行首先分配局部变量,然后尝试调用不存在的方法。

正如你所说 - 没有 return foo if (foo = bar.some_method)return foo if (true && (foo = bar.some_method)) 会起作用,我敢打赌,如果你没有在此行之前定义 foo,它不会起作用。

【讨论】:

该死的我以为我删除了这个问题!我在发布后不久意识到,当我测试它时,我已经在 irb 中定义了 foo。我会把我的菜鸟的证据留给其他人学习。感谢您的回答。

以上是关于条件“if”修饰符中的 Ruby 变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

if 语句中的变量赋值

if 条件中的链式赋值

为刀片文件中的变量赋值

run keyword if判断条件正确后,如何对条件变量进行进行赋值

如何使用 ruby​​ 的多重赋值为 void 变量赋值?

Ruby 可枚举块变量赋值