# Weird behavior with hpricot and variable assignment

**URL:** <https://www.ruby-forum.com/t/weird-behavior-with-hpricot-and-variable-assignment/120491>\
**Category:** Ruby\
**Created:** [November 17, 2007, 3:13pm UTC](https://www.ruby-forum.com/t/weird-behavior-with-hpricot-and-variable-assignment/120491 "2007-11-17T15:13:28Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![ridcully](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/5f9b8f/32.png) [@ridcully](https://www.ruby-forum.com/u/ridcully)\
**Post date:** [November 17, 2007, 3:13pm UTC](https://www.ruby-forum.com/t/weird-behavior-with-hpricot-and-variable-assignment/120491/1 "2007-11-17T15:13:28Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![ridcully](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/5f9b8f/32.png) [@ridcully](https://www.ruby-forum.com/u/ridcully)\
**Post date:** [November 17, 2007, 5:20pm UTC](https://www.ruby-forum.com/t/weird-behavior-with-hpricot-and-variable-assignment/120491/2 "2007-11-17T17:20:41Z")

</div>

On Nov 17, 8:06 am, ridcully [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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)

---

<div class="post-metadata">

**Author:** ![ridcully](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/5f9b8f/32.png) [@ridcully](https://www.ruby-forum.com/u/ridcully)\
**Post date:** [November 17, 2007, 11:35pm UTC](https://www.ruby-forum.com/t/weird-behavior-with-hpricot-and-variable-assignment/120491/3 "2007-11-17T23:35:56Z")

</div>

On Nov 17, 5:16 pm, yermej [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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
