[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Weird behavior with hpricot and variable assignment

ridcully

11/17/2007 2:06:00 PM

Hi,

Could someone please help me to understand the difference of:

html = Hpricot( "<div><div></div></div>" )
(html/'/div').each do |item|
x = (item/'/div')[0].to_html
p x
end

output: "<div></div>"

and

html = Hpricot( "<div><div></div></div>" )
(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
2 Answers

yermej

11/17/2007 4:17:00 PM

0

On Nov 17, 8:06 am, ridcully <goo...@ridcully.net> wrote:
> Hi,
>
> Could someone please help me to understand the difference of:
>
> html = Hpricot( "<div><div></div></div>" )
> (html/'/div').each do |item|
> x = (item/'/div')[0].to_html
> p x
> end
>
> output: "<div></div>"
>
> and
>
> html = Hpricot( "<div><div></div></div>" )
> (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)

ridcully

11/17/2007 10:33:00 PM

0

On Nov 17, 5:16 pm, yermej <yer...@gmail.com> wrote:
>
> 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)

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