【发布时间】:2011-07-05 06:11:47
【问题描述】:
【问题讨论】:
【问题讨论】:
有一个区别:一个类可以定义 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。
虽然这两个操作非常不同,但我很确定它们总是会产生相同的结果。 (一个调用 NilClass 对象的 #nil? 方法,另一个与 nil 单例进行比较。)
我建议,当你有疑问时,你可以采用第三种方法,实际上,只测试表达式的真值。
所以,if x 而不是 if x == nil 或 if x.nil?,以便在表达式值为 false 时进行此测试 DTRT。
【讨论】: