下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
下面的代码在Ruby中是什么意思?
||=
它的语法有什么意义或原因吗?
当前回答
这是默认的赋值表示法
例如:x ||= 1 这将检查x是否为nil。如果x确实为nil,那么它就会赋给它一个新值(在我们的例子中是1)
更明确的表示: 如果x == nil X = 1 结束
其他回答
它的意思是或等于。它检查左边的值是否有定义,然后使用它。如果不是,使用右边的值。您可以在Rails中使用它来缓存模型中的实例变量。
一个基于rails的快速示例,我们创建了一个函数来获取当前登录的用户:
class User > ActiveRecord::Base
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
end
它检查是否设置了@current_user实例变量。如果是,它将返回该值,从而节省数据库调用。但如果没有设置,则执行调用,然后将@current_user变量设置为该值。这是一种非常简单的缓存技术,但非常适合在应用程序中多次获取相同的实例变量。
A ||= b和A = b是一样的如果A。nil?或者a = b,除非a
但是所有3个选项都能显示相同的性能吗?在Ruby 2.5.1中
1000000.times do
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
a ||= 1
end
在我的电脑上花费0.099秒,而
1000000.times do
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
a = 1 unless a
end
用时0.062秒。这几乎快了40%。
然后我们还有:
1000000.times do
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
a = 1 if a.nil?
end
这需要0.166秒。
并不是说这将在一般情况下产生重大的性能影响,但是如果您确实需要最后一点优化,那么可以考虑这个结果。 顺便说一下:a = 1,除非a对新手来说更容易理解,否则它是不言自明的。
注1:重复分配行多次的原因是为了减少循环在测量时间上的开销。
注2:如果我在每次赋值前执行a=nil,结果是类似的。
除非x X = y 结束
除非x有值(不是nil或false),否则将其设为y
等于
X ||= y
A ||= b
表示如果'a'中存在任何值并且您不想更改它,则继续使用该值,否则如果'a'没有任何值,则使用'b'的值。
简单的话,如果左手边不为空,则指向现有的值,否则指向右边的值。
假设a = 2, b = 3
那么,||= b将得到a的值,即2。
当a计算为某个值时,结果不是false或nil..这就是为什么它不计算b的值。
现在假设a = nil, b = 3。
那么||= b将得到3,即b的值。
因为它首先尝试评估a的值,结果是nil..它求出b的值。
ror app中使用的最佳示例是:
#To get currently logged in iser
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
# Make current_user available in templates as a helper
helper_method :current_user
其中,User.find_by_id(session[:user_id])当且仅当@current_user之前未初始化时触发。