Hi --

On Mon, 13 Nov 2006, Sebastian Reid wrote:

> Hi all.
>
> 	I've been working on some Ruby projects using the Rails framework and 
> getting on well, however recently I've started on some projects using Ruby 
> alone and have run into some issues as the task gets a little more 
> complicated.
>
> 	One particular script is giving me trouble and I suspect it is due to 
> my Perly ways.  Below is a pastebin of the code.  As some I'm sure can tell, 
> it is an rbot plugin that right now doesn't do a whole lot.
>
> http://pastebin.com/822611
>
> 	The highlighted line is flagging up the error:
>
> TypeError: no implicit conversion from nil to integer
>
> 	on line 18 (highlighted).
>
> 	Now this is looking to me like a variable instantiation issue which 
> brings us back to Perl.  In Perl that line would be perfectly legal (though 
> some would debate its elegance) and hashes and arrays would be created as and 
> when required.

In Ruby that won't work (as you've seen), specifically because [] is a
method.  When you do:

   x["y"]

you're really doing:

   x.[]("y")

Arrays and hashes have a [] method, but so can any object; so the
presence of [] doesn't narrow down the field.

> 	I'm willing to accept that this may not be the best way to do things 
> in Ruby, thus I come to you to ask for a quick rundown on best practices in 
> these situations.
>
> 	I've played around with default procs and the like in the 
> initialisation routine to no avail.  There is an implicit dump somewhere 
> which causes problems.  What would be the best way to deal with this type of 
> thing?

You'd probably be likely to see @registry initialized in the
initialize method, and then its elements initialized conditionally
along the way:

   (@registry["content"] ||= []).push(m.message)

You can certainly economize on this if you do:

   @registry = Hash.new {|h,k| h[k] = [] }

though this approach might be less slick as you get into deeper
nesting.

You might want to encapsulate the behavior in a class or module, and
even perhaps have a class representing @registry["context"].


David

-- 
                   David A. Black | dblack / rubypal.com
Author of "Ruby for Rails"   [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog)        [2] | Co-director, Ruby Central, Inc.   [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com    | [4] http://www.rubycentral.org