下面的代码在Ruby中是什么意思?

||=

它的语法有什么意义或原因吗?


当前回答

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

  x ||= y

等于

  x = x || y

或者

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

其他回答

它的意思是或等于。它检查左边的值是否有定义,然后使用它。如果不是,使用右边的值。您可以在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,否则,它将保留它的原始值,在本例中为5:

irb(main):020:0> x = 5
=> 5
irb(main):021:0> y = 10
=> 10
irb(main):022:0> x ||= y
=> 5

# Now set x to nil. 

irb(main):025:0> x = nil
=> nil
irb(main):026:0> x ||= y
=> 10

简而言之,||=b意味着:如果a是undefined、nil或false,则将b赋值给a。否则,保持a不变。

||= b是一个条件赋值运算符。它的意思是:

如果a是未定义的或假的,则计算b并将a设置为结果。 否则(如果定义了a并计算为真),则不计算b,并且不进行赋值。

例如:

a ||= nil # => nil
a ||= 0 # => 0
a ||= 2 # => 0

foo = false # => false
foo ||= true # => true
foo ||= false # => true

令人困惑的是,它看起来类似于其他赋值操作符(例如+=),但行为不同。

A += b转换为A = A + b ||= b大致可以转换为|| A = b

它是|| a = b的近似缩写。不同之处在于,当a未定义时,|| a = b将引发NameError,而||= b将a设置为b。如果a和b都是局部变量,这种区别不重要,但如果其中一个是类的getter/setter方法,则很重要。

进一步阅读:

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html