0

CSV::Rowそこで、Ruby 1.9.3-p374 で次のようにオブジェクトと nilを含む配列を生成します。

 csv_array = [nil, #<CSV::Row "name":John>, nil, nil, #<CSV::Row "name":John>]

次のコード行は正常に機能します。

 csv_array.delete_if { |x| x.nil? }

しかし、この行はエラーを出します:

 csv_array.delete_if { |x| x==nil }

エラー:

.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/csv.rb:478:in `==': undefined method `row' for nil:NilClass (NoMethodError)

これがなぜなのかについてのアイデアはありますか?私は考え==nil.nil?同じ結果をもたらすだろうと思いました。

4

2 に答える 2

0

==nil と .nil だと思った?同じ結果が得られます。

はい、彼らは与えています。以下の例を見てください:

require 'csv'

c1 = CSV::Row.new(["h1","h2","h3"],[1,2,3])
# => #<CSV::Row "h1":1 "h2":2 "h3":3>
c2 = CSV::Row.new(["h1","h3","h4"],[1,2,3])
# => #<CSV::Row "h1":1 "h3":2 "h4":3>
[nil,c1,c2].delete_if { |x| x.nil? }
# => [#<CSV::Row "h1":1 "h2":2 "h3":3>, #<CSV::Row "h1":1 "h3":2 "h4":3>]
[nil,c1,c2].delete_if { |x| x==nil }
# => [#<CSV::Row "h1":1 "h2":2 "h3":3>, #<CSV::Row "h1":1 "h3":2 "h4":3>]
c1.respond_to?(:nil?) # => true
c1.respond_to?(:==) # => true
c1==nil # => false
c1.nil? # => false

エラーと思われるコードは完璧です。しかし、行から、コードの他の場所'==': undefined method 'row' for nil:NilClass (NoMethodError)で使用したことは明らかです。したがって、メソッドがないため、エラーが発生しました。something == something.rowsomethingnilNilClass#row

于 2013-08-22T18:35:55.503 に答える
0

CSV::Rowオーバーライド==し、実装では、比較対象もCSV::Row. そのクラス以外のものを渡すと、爆発する可能性があります。

これは悪い習慣であり、この場合は失敗するのではなく false を返すべきであると主張することができます (これは ruby​​ 2.0 で変更されたようです)。

nil?一方、オーバーライドされていないため、期待どおりに機能します。

于 2013-08-23T17:02:01.533 に答える