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.
导致第二行出错的第一行和第二行之间的评估有何不同?
仔细阅读:
另一个常见的令人困惑的情况是在使用修饰符时:
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在这一行之前定义,它就行不通.