发布于 2011-07-05 06:32:18
有一个不同之处:类可以定义为零?事实是:
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)发布于 2011-07-05 06:17:33
虽然这两个操作是非常不同的,但我很肯定它们总是会产生相同的结果。(其中一个调用#nil?对象的NilClass方法,并与nil单例进行比较。)
我建议,当你有疑问的时候,实际上,你可以走第三条路,测试一个表达式的真值。
因此,if x而不是if x == nil或if x.nil?,以便在表达式值为false时进行此测试DTRT。
https://stackoverflow.com/questions/6578554
复制相似问题