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

||=

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


当前回答

这是默认的赋值表示法

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

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

其他回答

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

如果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 = 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实例变量的值。

A ||= b

表示如果'a'中存在任何值并且您不想更改它,则继续使用该值,否则如果'a'没有任何值,则使用'b'的值。

简单的话,如果左手边不为空,则指向现有的值,否则指向右边的值。