2011-07-05 33 views

回答

1

虽然这两个操作是非常不同的我很确定他们总是会产生相同的结果。 (一种叫做NilClass对象的#nil?方法,另一种叫做nil单身人士。)

我会建议,如果有人怀疑你走第三条路,实际上只是测试表达式的真值。

所以,if x和不if x == nilif x.nil?,为了具有该测试DTRT当表情值

2

有一个区别:一个类可能定义零?是真的:

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

这可能是一个非常糟糕的主意重新实现''为零,因为它会导致各种混乱的? – tadman

+2

你可以重新实现'=='(和相关的方法),这样'X.new == nil'返回true。 –

+0

你是对的 - ruby​​总是比预期的更灵活;) – knut