下面的代码在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变量设置为该值。这是一种非常简单的缓存技术,但非常适合在应用程序中多次获取相同的实例变量。

其他回答

||=是一个条件赋值运算符

  x ||= y

等于

  x = x || y

或者

if defined?(x) and x
    x = x
else 
    x = y
end

这就像延迟实例化。 如果变量已经定义,它将获取该值,而不是重新创建该值。

Basically,

X ||= y表示

如果x有任何值,不要改变它的值,否则 将x设为y

这是默认的赋值表示法

例如:x ||= 1 这将检查x是否为nil。如果x确实为nil,那么它就会赋给它一个新值(在我们的例子中是1)

更明确的表示: 如果x == nil X = 1 结束

假设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之前未初始化时触发。