【问题标题】:Ruby question - == nil or nil? [duplicate]Ruby 问题 - == nil 还是 nil? [复制]
【发布时间】:2011-07-05 06:11:47
【问题描述】:

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

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

【问题讨论】:

    标签: ruby null


    【解决方案1】:

    有一个区别:一个类可以定义 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
    

    运行 nil 基准测试?好像快了一点。

    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)
    

    【讨论】:

    • 重新实现nil?可能是一个非常糟糕的主意,因为它会引起各种混乱。
    • 您可以重新实现==(和相关方法),以便X.new == nil 返回true。
    • 你是对的 - ruby​​ 总是像预期的那样灵活;)
    【解决方案2】:

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

    我建议,当你有疑问时,你可以采用第三种方法,实际上,只测试表达式的真值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2016-04-08
      相关资源
      最近更新 更多