2011-07-05 2 views

答えて

1

2つの操作は非常に異なりますが、常に同じ結果が得られることは間違いありません。 (1つはNilClassオブジェクトの#nil?メソッドを呼び出し、1つはnilシングルトンと比較します)

疑問がある場合は、実際には3番目の方法を試して、式の真理値をテストすることをお勧めします。

ので、if xなくif x == nilまたはif x.nil?は、このテストDTRTを持っているために、式の値はあるとき。

2

1つの違いがあります:クラスは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) 
+1

は、それはおそらく再実装 'nilに本当に悪いアイデアだ'それはカオスのすべての種類の原因となりますので、?。 – tadman

+2

'=='(および関連するメソッド)を再実装して、 'X.new == nil'がtrueを返すようにすることができます。 –

+0

あなたは正しいです - ルビーはいつも予想どおりより柔軟です;) – knut

関連する問題