Ruby问题 - == nil还是nil?

时间:2011-07-05 06:11:47

标签: ruby null

  

可能重复:
  obj.nil? vs. obj == nil

我发现了一个问题 - 哪一个更好== nilnil? 我一直认为这两件事情是一样的。有什么不同吗?

2 个答案:

答案 0 :(得分:2)

有一个区别:一个类可能定义为nil?为真:

class X
  def nil?()
    true
  end
end

puts X.new.nil? #-> true

或者一个实际的例子(我不推荐它,如果你需要它,我会定义一个nil_or_empty?):

class String
  def nil?()
    return empty?
  end
end

puts 'aa'.nil? #-> false
puts ''.nil? #-> true

运行基准测试零?似乎要快一点。

require 'benchmark'

TEST_LOOPS = 100_000_000

C_A = nil
C_B = 'aa'

Benchmark.bmbm(10) {|b|

  b.report('nil?') {
   TEST_LOOPS.times { 
      x = C_A.nil?
      x = C_B.nil?
   }            #Testloops
  }
  b.report('==nil') {
   TEST_LOOPS.times { 
      x = ( C_A == nil )
      x = ( C_B == nil )
   }            #Testloops
  }             #b.report

} #Benchmark

结果:

Rehearsal ---------------------------------------------
nil?       27.454000   0.000000  27.454000 ( 27.531250)
==nil      31.000000   0.000000  31.000000 ( 31.078125)
----------------------------------- total: 58.454000sec

                user     system      total        real
nil?       27.515000   0.000000  27.515000 ( 27.546875)
==nil      31.125000   0.000000  31.125000 ( 31.171875)

答案 1 :(得分:1)

尽管这两个操作非常不同,但我很确定它们总会产生相同的结果。 (一个调用NilClass对象的#nil?方法,一个与nil单例进行比较。)

我建议,如果有疑问,你实际上是第三种方式,只是测试一个表达式的真值。

所以,if x而非if x == nilif x.nil?,以便在表达式值 false 时进行此测试DTRT。