条件"if"修饰符中的Ruby变量赋值

jz9*_*999 2 ruby if-statement local-variables variable-assignment

我有一个关于Ruby解释器如何分配变量的问题:

我经常使用这个:

return foo if (foo = bar.some_method)
Run Code Online (Sandbox Code Playgroud)

some_method返回一个对象或nil.

但是,当我尝试这个:

return foo if (true && (foo = bar.some_method))
Run Code Online (Sandbox Code Playgroud)

我得到:NameError:未定义的局部变量或方法foo for main:Object.

导致第二行出错的第一行和第二行之间的评估有何不同?

Aru*_*hit 7

仔细阅读:

另一个常见的令人困惑的情况是在使用修饰符时:

p a if a = 0.zero?
Run Code Online (Sandbox Code Playgroud)

而不是打印true您收到NameError,"未定义的局部变量或方法'a'".由于Ruby解析了第一个的a左侧,if并且尚未看到对它的赋值,因此假设您希望调用方法.然后Ruby看到了赋值,a并假设你引用了一个local method.

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

正如你所说的 - 没有return foo if (foo = bar.some_method)并且return foo if (true && (foo = bar.some_method))会起作用,我打赌你,如果你没有foo在这一行之前定义,它就行不通.

  • 该死的我以为我删除了这个问题!我发布之后不久就意识到我在测试时已经在irb中定义了foo.我会把这个我的无聊的证据留给别人学习.谢谢回答. (2认同)