可能重复:
obj.nil? vs. obj == nil
我发现了一个问题 - 哪一个更好== nil
或nil
?
我一直认为这两件事情是一样的。有什么不同吗?
答案 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 == nil
或if x.nil?
,以便在表达式值 false 时进行此测试DTRT。