条件“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.

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

解决方法

Read it carefully

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

p a if a = 0.zero?

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

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

正如你所说 – 如果(foo = bar.some_method)没有返回foo并返回foo if(true&&(foo = bar.some_method))将起作用,我敢打赌,如果你没有,它将无法工作在这一行之前定义foo.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...