[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Undefined method

Mark Liang

12/14/2005 3:04:00 AM

I've recently started learning Ruby, I cannot seem to locate the
cause of this error. Please pardon me if the answer is more
straightforward as it seems.

I've double-checked, blkcheck method works fine. I suspect the
problem lies with line 32, Blk.each ..., however, I don't see why
a problem should be there. Please help shed some light.

The error message:

../creat.rb:25:in `blkcheck': undefined method `[]' for nil:NilClass
(NoMethodError)
from ./creat.rb:25:in `times'
from ./creat.rb:25:in `blkcheck'
from ./creat.rb:24:in `times'
from ./creat.rb:24:in `blkcheck'
from ./creat.rb:33:in `blkscheck'
from ./creat.rb:32:in `each'
from ./creat.rb:32:in `blkscheck'
from ./creat.rb:45


The src:

1 #!/usr/bin/ruby
2
3 Val = [1, 2, 3, 4, 5, 6, 7, 8, 9]
4 Blk = [[0,0],[0,3],[0,6],[3,0],[3,3],[3,6],[6,0],[6,3],[6,6]]
5
6 def linescheck (tab)
7 num = 0
8 9.times { |i| num += 1 if tab[i].sort == Val }
9 1 if num == 9
10 end
11
12 def colscheck (tab)
13 num = 0
14 9.times do |i|
15 tmp = []
16 9.times { |j| tmp <<= tab[j][i] }
17 num += 1 if tmp.sort == Val
18 end
19 1 if num == 9
20 end
21
22 def blkcheck (tab, i, j)
23 tmp = []
24 3.times do |k|
25 3.times { |l| tmp <<= tab[i+k+l][j+k] }
26 end
27 1 if tmp.sort == Val
28 end
29
30 def blkscheck (tab)
31 num = 0
32 Blk.each do |i,j|
33 num += 1 if blkcheck(tab,i,j)
34 end
35 1 if num == 9
36 end
37
38 # Create the table of values
39 val = []
40 9.times do |i|
41 val <<= Val
42 end
43
44 #blkscheck(val)
45 print "Hello world!\n" unless blkscheck(val)

4 Answers

dblack

12/14/2005 3:51:00 AM

0

Johannes Friestad

12/14/2005 4:58:00 AM

0

The simplest way to debug something like this is to add a few print
statements so you see which values are involved.

The error
>> /creat.rb:25:in `blkcheck': undefined method `[]' for nil:NilClass
> > (NoMethodError)
means that your line 25 has just called '[]' on nil.

So in line 25
>> 3.times { |l| tmp <<= tab[i+k+l][j+k] }
either "tab" or "tab[i+k+l]" is nil. But you don't know which, or why.

By adding a couple of print statements to your method, like this
--------
def blkcheck (tab, i, j)
tmp = []
printf("input: i=%i, j=%i, tab(length=%i)=%s\n", i, j, tab.length,
tab.inspect)
3.times do |k|
3.times { |l|
e1=tab[i+k+l]
e2=e1[j+k] if e1
printf("tab[%i]=%s, tab[%i][%i]=%s\n", i+k+l, e1.inspect,
i+k+l, j+k, e2.inspect)
tmp <<= tab[i+k+l][j+k]
}
end
1 if tmp.sort == Val
end
--------

you'll get a printout like this
------
input: i=6, j=0, tab(length=9)=[[1, 2, 3, ...]....]
tab[6]=[1, 2, 3, 4, 5, 6, 7, 8, 9], tab[6][0]=1
tab[7]=[1, 2, 3, 4, 5, 6, 7, 8, 9], tab[7][0]=1
tab[8]=[1, 2, 3, 4, 5, 6, 7, 8, 9], tab[8][0]=1
tab[7]=[1, 2, 3, 4, 5, 6, 7, 8, 9], tab[7][1]=2
tab[8]=[1, 2, 3, 4, 5, 6, 7, 8, 9], tab[8][1]=2
tab[9]=nil, tab[9][1]=nil
NoMethodError: undefined method `[]' for nil:NilClass
-----

and it's easy to see that the nil error comes from calling tab[9] on
an array of length 9.

Good luck with your future debugging :)

On 12/13/05, dblack@wobblini.net <dblack@wobblini.net> wrote:
> Hi --
>
> On Wed, 14 Dec 2005, Mark Liang wrote:
>
> > I've recently started learning Ruby, I cannot seem to locate the
> > cause of this error. Please pardon me if the answer is more
> > straightforward as it seems.
> >
> > ../creat.rb:25:in `blkcheck': undefined method `[]' for nil:NilClass
> > (NoMethodError)
> > from ./creat.rb:25:in `times'
> > from ./creat.rb:25:in `blkcheck'
> > from ./creat.rb:24:in `times'
> > from ./creat.rb:24:in `blkcheck'
> > from ./creat.rb:33:in `blkscheck'
> > from ./creat.rb:32:in `each'
> > from ./creat.rb:32:in `blkscheck'
> > from ./creat.rb:45
> >


Tom Reilly

12/14/2005 3:27:00 PM

0

You could also define [] for the nil class and have it return whatever
you thought appropriate. For example:

class NilClass
def []
nil #or whatever you want returned
end
end


Mark Liang wrote:

>I've recently started learning Ruby, I cannot seem to locate the
>cause of this error. Please pardon me if the answer is more
>straightforward as it seems.
>
>I've double-checked, blkcheck method works fine. I suspect the
>problem lies with line 32, Blk.each ..., however, I don't see why
>a problem should be there. Please help shed some light.
>
>The error message:
>
>../creat.rb:25:in `blkcheck': undefined method `[]' for nil:NilClass
>(NoMethodError)
> from ./creat.rb:25:in `times'
> from ./creat.rb:25:in `blkcheck'
> from ./creat.rb:24:in `times'
> from ./creat.rb:24:in `blkcheck'
> from ./creat.rb:33:in `blkscheck'
> from ./creat.rb:32:in `each'
> from ./creat.rb:32:in `blkscheck'
> from ./creat.rb:45
>
>
>The src:
>
> 1 #!/usr/bin/ruby
> 2
> 3 Val = [1, 2, 3, 4, 5, 6, 7, 8, 9]
> 4 Blk = [[0,0],[0,3],[0,6],[3,0],[3,3],[3,6],[6,0],[6,3],[6,6]]
> 5
> 6 def linescheck (tab)
> 7 num = 0
> 8 9.times { |i| num += 1 if tab[i].sort == Val }
> 9 1 if num == 9
> 10 end
> 11
> 12 def colscheck (tab)
> 13 num = 0
> 14 9.times do |i|
> 15 tmp = []
> 16 9.times { |j| tmp <<= tab[j][i] }
> 17 num += 1 if tmp.sort == Val
> 18 end
> 19 1 if num == 9
> 20 end
> 21
> 22 def blkcheck (tab, i, j)
> 23 tmp = []
> 24 3.times do |k|
> 25 3.times { |l| tmp <<= tab[i+k+l][j+k] }
> 26 end
> 27 1 if tmp.sort == Val
> 28 end
> 29
> 30 def blkscheck (tab)
> 31 num = 0
> 32 Blk.each do |i,j|
> 33 num += 1 if blkcheck(tab,i,j)
> 34 end
> 35 1 if num == 9
> 36 end
> 37
> 38 # Create the table of values
> 39 val = []
> 40 9.times do |i|
> 41 val <<= Val
> 42 end
> 43
> 44 #blkscheck(val)
> 45 print "Hello world!\n" unless blkscheck(val)
>
>
>
>
>



Jacob Fugal

12/14/2005 4:40:00 PM

0

On 12/14/05, Tom Reilly <w3gat@nwlagardener.org> wrote:
> You could also define [] for the nil class and have it return whatever
> you thought appropriate. For example:
>
> class NilClass
> def []
> nil #or whatever you want returned
> end
> end

No, no, NO! See, this situation is exactly why I *wouldn't* want
Ruby's nil to follow the NilObject pattern (or whatever it's called).
If it did, Mark would be getting wrong results as opposed to the
undefined method exception. Which do you think is easier to debug?
I'll take the exception that tells me what line number, any day.

Jacob Fugal