------art_96271_18320883.1163353479616
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On 11/12/06, David Vallner <david / vallner.net> 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).


agreed but see JEGII remark about warnings



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.


501/2 > ruby -e 'puts Array.new[nil]'
-e:1:in `[]': no implicit conversion from nil to integer (TypeError)
        from -e:1
Given that I rather think  that
(a) @registry["memory"] is referencing an Array object
and
(b) @registry["context"][1] evaluates to nil

That was the question OP, or was it not?
Now if you really want to shoot yourself into your leg here is the gun:

class  GunArray < Array
       def [] *args, &block
            super(*args,&block) rescue nil end
       end
end


you could also monkeypatch Array but I am too lazy to look if its
method_alias or alias_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?


That is definitely my advice too, but I am less strict ;)

David Vallner
>
>
>
> Cheers
Robert


-- 
The reasonable man adapts himself to the world; the unreasonable one
persists in trying to adapt the world to himself. Therefore all progress
depends on the unreasonable man.

- George Bernard Shaw

------art_96271_18320883.1163353479616--