Weird behavior with hpricot and variable assignment

Hi,

Could someone please help me to understand the difference of:

html = Hpricot( “

” )
(html/’/div’).each do |item|
x = (item/’/div’)[0].to_html
p x
end

output: “

and

html = Hpricot( “

” )
(html/’/div’).each do |item|
p (item/’/div’)[0].to_html
end

gives “undefined method `[]’ for nil:NilClass (NoMethodError)” in line
3

Shouldn’t the code snippets semantically be the same?

Thanks,
Andreas

On Nov 17, 8:06 am, ridcully [email protected] wrote:

output: “

and

html = Hpricot( “

” )
(html/‘/div’).each do |item|
p (item/‘/div’)[0].to_html
end

gives “undefined method `[]’ for nil:NilClass (NoMethodError)” in line
3

Try your second example in irb and you’ll get a warning (or I do,
anyway):

(irb):5: warning: don’t put space before argument parentheses

This means you’re essentially doing this:

(p(item/‘/div’))[0].to_html

and since p returns nil, you’re calling [] on nil. Try this instead:

p((item/‘/div’)[0].to_html)

On Nov 17, 5:16 pm, yermej [email protected] wrote:

and since p returns nil, you’re calling [] on nil. Try this instead:

p((item/‘/div’)[0].to_html)

You’re right, it does work if I add parentheses.
Still I don’t fully understand why this is happening. The [] operator
obviously has a high presendence, because this of course does work:

p [1, 2, 3][0].to_s

Also this does work fine:

p (html/‘/div’)[0].to_html

I don’t really see the difference to my second example. What am I
missing here?

Andreas