下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
当前回答
还请记住||=不是原子操作,因此,它不是线程安全的。根据经验,不要将它用于类方法。
其他回答
它的意思是或等于。它检查左边的值是否有定义,然后使用它。如果不是,使用右边的值。您可以在Rails中使用它来缓存模型中的实例变量。
一个基于rails的快速示例,我们创建了一个函数来获取当前登录的用户:
class User > ActiveRecord::Base
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
end
它检查是否设置了@current_user实例变量。如果是,它将返回该值,从而节省数据库调用。但如果没有设置,则执行调用,然后将@current_user变量设置为该值。这是一种非常简单的缓存技术,但非常适合在应用程序中多次获取相同的实例变量。
这个问题在Ruby邮件列表和Ruby博客上讨论得如此频繁,以至于现在Ruby邮件列表上甚至有一些线程,它们的唯一目的就是收集到Ruby邮件列表上讨论这个问题的所有其他线程的链接。
这里有一个:||= (OR Equal)线程和页面的最终列表
如果你真的想知道发生了什么,可以看看Ruby语言规范草案的第11.4.2.3节“缩写赋值”。
作为第一近似,
a ||= b
等于
a || a = b
并不等同于
a = a || b
然而,这只是一种近似,特别是在a未定义的情况下。根据是简单的变量赋值、方法赋值还是索引赋值,语义也有所不同:
a ||= b
a.c ||= b
a[c] ||= b
都有不同的待遇。
除非x X = y 结束
除非x有值(不是nil或false),否则将其设为y
等于
X ||= y
b = 5
a ||= b
这句话的意思是:
a = a || b
这将是
a = nil || 5
所以最后
a = 5
现在如果你再调用这个:
a ||= b
a = a || b
a = 5 || 5
a = 5
b = 6
现在如果你再调用这个:
a ||= b
a = a || b
a = 5 || 6
a = 5
如果你观察,b的值不会被分配给a, a仍然有5。
它是Ruby中用来加快访问速度的一种记忆模式。
def users
@users ||= User.all
end
这句话的意思是:
@users = @users || User.all
第一次调用这个方法时,你会调用数据库。
以后对该方法的调用将只返回@users实例变量的值。
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a ||= 2
=> 1
因为a已经被设为1了
irb(main):003:0> a = nil
=> nil
irb(main):004:0> a ||= 2
=> 2
因为a是nil