首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石问题- ==零还是零?

红宝石问题- ==零还是零?
EN

Stack Overflow用户
提问于 2011-07-05 06:11:47
回答 2查看 491关注 0票数 2

可能重复:

obj.nil? vs. obj == nil

我发现了一个问题- == nil还是nil哪个更好?

我一直认为这两件事是一样的。有什么不同吗?

EN

回答 2

Stack Overflow用户

发布于 2011-07-05 06:32:18

有一个不同之处:类可以定义为零?事实是:

代码语言:javascript
复制
class X
  def nil?()
    true
  end
end

puts X.new.nil? #-> true

或者一个实际的例子(我不推荐它,如果您需要它,我会定义一个nil_or_empty?):

代码语言:javascript
复制
class String
  def nil?()
    return empty?
  end
end

puts 'aa'.nil? #-> false
puts ''.nil? #-> true

运行基准零?看上去要快一点。

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2011-07-05 06:17:33

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

我建议,当你有疑问的时候,实际上,你可以走第三条路,测试一个表达式的真值。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6578554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档