【问题标题】:Ruby variable assignment in a conditional "if" modifier条件“if”修饰符中的 Ruby 变量赋值
【发布时间】: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.

第一行和第二行的求值有什么不同导致第二行出错?

【问题讨论】:

  • 因为在第二个变体中赋值会被短路。但是,嗯,我不确定这是一种有助于可读性的模式。

标签: ruby if-statement variable-assignment local-variables


【解决方案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。我会把我的菜鸟的证据留给其他人学习。感谢您的回答。
猜你喜欢
  • 2013-07-14
  • 2012-10-03
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2015-01-26
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多