[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

array addressing problem

Tom Cloyd

6/16/2008 6:21:00 AM

I know this is a simple problem - to 'most everyone but me, but I cannot
see why I'm getting this error. I've explored things with ruby-debug,
and with irb inside of the debugger, and I simply cannot replicate the
error.

The code (this most of a little routine for converting an HTML file to a
textile marked up file):

# input
filein = open( "{whatever}" )
fi = filein.readlines
# output
fileout = open( "_textile.txt", 'w')
delta = [
["</p>", ''],
["</h1>", '']] # for brevity, I've truncated this array - you get
the idea, I assume
ld = delta.length
i = 0
until i > ld
#results = fi[0].gsub( delta[i][0], delta[i][1] ) <= in an attempt
isolate error, I broke this into the following:
s1 = delta[i][0] # <= exception is thrown here
s2 = delta[i][1]
results = fi[0].gsub( s1, s2 )
i += 1
end

The error msg:

$ ruby textilemkr.rb
textilemkr.rb:55:in `main': undefined method `[]' for nil:NilClass
(NoMethodError)
from textilemkr.rb:66

I've confirmed that delta[1][0] is valid, that "i" is 0 when error
occurs, etc.

If it works in irb, why doesn't it work when I run the routine via the
interpreter? What obvious thing am I missing?

All help will be gratefully accepted.

Tom

--




2 Answers

David A. Black

6/16/2008 6:46:00 AM

0

Hi --

On Mon, 16 Jun 2008, Tom Cloyd wrote:

> I know this is a simple problem - to 'most everyone but me, but I cannot see
> why I'm getting this error. I've explored things with ruby-debug, and with
> irb inside of the debugger, and I simply cannot replicate the error.
>
> The code (this most of a little routine for converting an HTML file to a
> textile marked up file):
>
> # input
> filein = open( "{whatever}" )
> fi = filein.readlines
> # output
> fileout = open( "_textile.txt", 'w')
> delta = [
> ["</p>", ''],
> ["</h1>", '']] # for brevity, I've truncated this array - you get the
> idea, I assume
> ld = delta.length
> i = 0 until i > ld
> #results = fi[0].gsub( delta[i][0], delta[i][1] ) <= in an attempt
> isolate error, I broke this into the following:
> s1 = delta[i][0] # <= exception is thrown here
> s2 = delta[i][1]
> results = fi[0].gsub( s1, s2 )
> i += 1
> end
>
> The error msg:
>
> $ ruby textilemkr.rb
> textilemkr.rb:55:in `main': undefined method `[]' for nil:NilClass
> (NoMethodError)
> from textilemkr.rb:66
>
> I've confirmed that delta[1][0] is valid, that "i" is 0 when error occurs,
> etc.
>
> If it works in irb, why doesn't it work when I run the routine via the
> interpreter? What obvious thing am I missing?

It doesn't work in irb:

>> delta = [
?> ["</p>", ''],
?> ["</h1>", '']] #
=> [["</p>", ""], ["</h1>", ""]]
>> ld = delta.length
=> 2
>> i = 0
=> 0
>> until i > ld
>> s1 = delta[i][0] # <= exception is thrown here
>> s2 = delta[i][1]
>> i += 1
>> end
NoMethodError: undefined method `[]' for nil:NilClass

The problem is that the length of the array is 2, but delta[2] is nil.
I'm reasonably sure that that's when it's failing, not when i is 0,
unless the shortened version is missing something that would make that
happen.

I would dispense with i entirely and just iterate over delta.


David

--
Rails training from David A. Black and Ruby Power and Light:
ADVANCING WITH RAILS June 16-19 Berlin
ADVANCING WITH RAILS July 21-24 Edison, NJ
See http://www.r... for details and updates!

Tom Cloyd

6/16/2008 6:53:00 AM

0

David A. Black wrote:
> Hi --
>
> On Mon, 16 Jun 2008, Tom Cloyd wrote:
>
>> I know this is a simple problem - to 'most everyone but me, but I
>> cannot see why I'm getting this error. I've explored things with
>> ruby-debug, and with irb inside of the debugger, and I simply cannot
>> replicate the error.
>>
>> The code (this most of a little routine for converting an HTML file
>> to a textile marked up file):
>>
>> # input
>> filein = open( "{whatever}" )
>> fi = filein.readlines
>> # output
>> fileout = open( "_textile.txt", 'w')
>> delta = [
>> ["</p>", ''],
>> ["</h1>", '']] # for brevity, I've truncated this array - you get
>> the idea, I assume
>> ld = delta.length
>> i = 0 until i > ld
>> #results = fi[0].gsub( delta[i][0], delta[i][1] ) <= in an attempt
>> isolate error, I broke this into the following:
>> s1 = delta[i][0] # <= exception is thrown here
>> s2 = delta[i][1]
>> results = fi[0].gsub( s1, s2 )
>> i += 1
>> end
>>
>> The error msg:
>>
>> $ ruby textilemkr.rb
>> textilemkr.rb:55:in `main': undefined method `[]' for nil:NilClass
>> (NoMethodError)
>> from textilemkr.rb:66
>>
>> I've confirmed that delta[1][0] is valid, that "i" is 0 when error
>> occurs, etc.
>>
>> If it works in irb, why doesn't it work when I run the routine via
>> the interpreter? What obvious thing am I missing?
>
> It doesn't work in irb:
>
>>> delta = [
> ?> ["</p>", ''],
> ?> ["</h1>", '']] # => [["</p>", ""], ["</h1>", ""]]
>>> ld = delta.length
> => 2
>>> i = 0
> => 0
>>> until i > ld
>>> s1 = delta[i][0] # <= exception is thrown here
>>> s2 = delta[i][1]
>>> i += 1
>>> end
> NoMethodError: undefined method `[]' for nil:NilClass
>
> The problem is that the length of the array is 2, but delta[2] is nil.
> I'm reasonably sure that that's when it's failing, not when i is 0,
> unless the shortened version is missing something that would make that
> happen.
>
> I would dispense with i entirely and just iterate over delta.
>
>
> David
>
Nice. Thanks much, on both points. I never "saw" i get to 2, and so
didn't see the error. Jeez. I do find it hard to be a weekend warrior
with Ruby. I lose bits between my ears during the workweek!

Thanks again for you help.

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC
Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< tc@tomcloyd.com >> (email)
<< TomCloyd.com >> (website & psychotherapy weblog)
<< sleightmind.wordpress.com >> (mental health issues weblog)
<< directpathdesign.com >> (web site design & consultation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~