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

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

我经常使用这个:

return foo if (foo = bar.some_method) 

some_method返回一个对象或nil。

但是,当我尝试这个:

 return foo if (true && (foo = bar.some_method)) 

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

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

仔细阅读 :

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

 pa if a = 0.zero? 

而不是打印true您会收到NameError,“未定义的局部变量或方法’a’” 。 由于Ruby首先解析了if a左边,并且还没有看到对它的赋值 ,因此假定你想调用一个方法。 然后,Ruby会将赋值视为a ,并假设您正在引用local method

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

如你所说 – 没有return foo if (foo = bar.some_method)并且return foo if (true && (foo = bar.some_method))将起作用,我打赌你,如果你没有定义foo它将无法工作在此之前。