0

So I generate an array containing CSV::Row objects and nil as follows in Ruby 1.9.3-p374:

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

The following line of code works fine:

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

But this line gives an error:

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

Error:

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

Any ideas on why this might be? I thought ==nil and .nil? would yield the same result.

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.row,那something就是nil。因此你得到了错误,因为NilClass没有任何#row方法。

于 2013-08-22T18:35:55.503 回答
0

CSV::Row覆盖==并且实现假定您要与之比较的东西也是CSV::Row. 如果你通过它任何不属于该类的东西,它很可能会爆炸。

您可能会争辩说这是不好的做法,在这种情况下它应该返回 false 而不是爆炸(这看起来在 ruby​​ 2.0 中已更改)

nil?另一方面,并​​没有被覆盖,因此可以按您的预期工作。

于 2013-08-23T17:02:01.533 回答