@registry unfortunately is not within my command, though yes I did  
consider using objects for its contents.  I'd rather use simpler  
(though nested) structures first if I can.

The problem with being explicit when initialising the nested  
structures is that they're going to be pretty dynamic throughout, not  
to mention the structure itself being changed as I go along.

That said, how would I go about initialising a hash in a hash value  
that doesn't exist yet and won't until runtime?  Unfortunately this  
is something I've gotten well used to not needing to know these days.


On 12 Nov 2006, at 17:18, David Vallner wrote:

> 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, only instance variables are autovivified to nil, and that by
> itself is a behaviour that gets on my nerves (typo-prone).
>
> From the code it looks @registry should be an object (maybe use a
> Struct) instead of a Hash, and you should preinitialise its  
> contents to
> empty arrays and whatnot in its initialize method.
>
>>
>>     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.
>
> Using blocks to initialize hashes / arrays is fine when not nested,
> otherwise things get messy. Clean up your data structure  
> initialisation
> to be explicit?
>
> David Vallner
>