Difference between nil? vs. (variable != nil)

Source A :

if (@product_coverages != nil && @product_coverages.length > 0)
@product_coverages = @product_coverages.each do
|product_coverage|
product_coverage.external_description =
Coverage.find(product_coverage.coverage_id).external_description # test
if (product_coverage.external_description != nil)
product_coverage.external_description.capitalize!
end
end
end

Source B :

if (@product_coverages != nil && @product_coverages.length > 0)
@product_coverages = @product_coverages.each do
|product_coverage|
product_coverage.external_description =
Coverage.find(product_coverage.coverage_id).external_description # test
return “” if product_coverage.external_description.nil?
product_coverage.external_description.capitalize!
end
end

I wanted to use Source B, but it return “” everytime. But Source A
works. I expected both of them to work.

Jason

On 12/6/06, Jason Vogel [email protected] wrote:

  end
    product_coverage.external_description.capitalize!
  end
end

I wanted to use Source B, but it return “” everytime. But Source A
works. I expected both of them to work.

Put in a test print, to see what nil? is returning. It is possible for
a class to override nil?, though it’s hard to think of why one would.

martin

If you put those source in a loop, source B always return “” if
product_coverage.external_description == nil while source A does not.
Basically those sources do different job .

On 12/6/06, Martin DeMello [email protected] wrote:

      product_coverage.external_description.capitalize!

Coverage.find(product_coverage.coverage_id).external_description # test

martin


Chỉ có lý trí của bản thân má»›i soi sáng được sá»± thật.“Cái đẹp đẽ nhất mÃ
chúng ta có thể trải nghiệm được là cái bí ẩn. Đó là cảm thức nền tảng
trong
cái nôi của nghệ thuật và khoa học chân chính. Kẻ nà o không biết đến nó,
không còn khả năng ngạc nhiên hay kinh ngạc, kẻ đó coi như đã chết, đã
tắt
rụi lá»­a sống trong mắt mình”“Das Schönste, was wir erleben können, ist
das
Geheimnisvolle. Es ist das Grundgefühl, das an der Wiege von wahrer
Kunst
und Wissenschaft steht. Wer es nicht kennt und sich nicht mehr wundern,
nicht mehr staunen kann, der ist sozusagen tot und sein Auge
erloschen.”“The
fairest thing we can experience is the mysterious. It is the fundamental
emotion which stands at the cradle of true art and true science. He who
knows it not and can no longer wonder, no longer feel amazement, is as
good
as dead, his eyelight has been extinct.”

I found ‘return “” if product_coverage.external_description.nil?’ as a
source sample somewhere, and I liked the readability factor. It seemed
very “Ruby-ish” to a PowerBuilder/Java/C# developer :-).

In the end, I’m trying to figure out my “best practice” for iterating
over an array of objects. I’ll happily take any suggestions.

Thanks,
Jason

James M. wrote:

Is there a particular reason you’re comparing to nil? Normally I’d just
write something like

(@product_coverages && @product_coverages.length > 0)

This is Perlish, and there’s people (myself included) that don’t like
the style - it hides the nil-check, which is useful to be more visible
if you’re doing it as a special case filter, like snippet B in the
original post does. I usually prefer getting rid of special cases like
missing arguments etc. with a series of checks and returns / exceptions
in the worse cases at a the beginning of a method to keep precondition
verification in one place instead of scattered through the code with
failure consequences interspersed with regular processing.

David V.

I appreciate the advice. I’ve just being trying to be careful to not
be too C#/Java-ish. I’ve never done any Perl.

Thanks,
Jason

Jason V. wrote:

I appreciate the advice. I’ve just being trying to be careful to not
be too C#/Java-ish. I’ve never done any Perl.

Huh? Why not? You should write that a) you can read easily, b) other
people working on the codebase can read easily.

The “Approved By The Grand Commitee Of Java Bashers ®” stamp comes, in
my opinion, very, very far behind. Consider the practical criteria
first.

David V.

Jason Vogel wrote:

  end
    product_coverage.external_description.capitalize!
  end
end

I wanted to use Source B, but it return “” everytime. But Source A
works. I expected both of them to work.

Jason

if @product_coverages != nil
@product_coverages.each { |p_c|
p_c.external_description =
Coverage.find(p_c.coverage_id).external_description and
p_c.external_description.capitalize!
}
end


A simpler way. When a description that’s nil is encountered,
replace it with “”.

if @product_coverages != nil
@product_coverages.each { |p_c|
p_c.external_description =
(Coverage.find(p_c.coverage_id).external_description or “”).
capitalize
}
end

Is there a particular reason you’re comparing to nil? Normally I’d just
write something like

(@product_coverages && @product_coverages.length > 0)

  • James M.