What does ||= (or-equals) mean in Ruby?

前端 未结 23 2885
情书的邮戳
情书的邮戳 2020-11-21 23:20

What does the following code mean in Ruby?

||=

Does it have any meaning or reason for the syntax?

23条回答
  •  再見小時候
    2020-11-21 23:23

    a ||= b is the same as saying a = b if a.nil? or a = b unless a

    But do all 3 options show the same performance? With Ruby 2.5.1 this

    1000000.times do
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
      a ||= 1
    end
    

    takes 0.099 Seconds on my PC, while

    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
    

    takes 0.062 Seconds. That's almost 40% faster.

    and then we also have:

    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
    

    which takes 0.166 Seconds.

    Not that this will make a significant performance impact in general, but if you do need that last bit of optimization, then consider this result. By the way: a = 1 unless a is easier to read for the novice, it is self-explanatory.

    Note 1: reason for repeating the assignment line multiple times is to reduce the overhead of the loop on the time measured.

    Note 2: The results are similar if I do a=nil nil before each assignment.

提交回复
热议问题