# Undefined method

**URL:** <https://www.ruby-forum.com/t/undefined-method/50198>\
**Category:** Ruby\
**Created:** [December 14, 2005, 4:08am UTC](https://www.ruby-forum.com/t/undefined-method/50198 "2005-12-14T04:08:12Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mark\_Liang](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/9e8a1a/32.png) [@Mark\_Liang](https://www.ruby-forum.com/u/Mark_Liang)\
**Post date:** [December 14, 2005, 4:08am UTC](https://www.ruby-forum.com/t/undefined-method/50198/1 "2005-12-14T04:08:12Z")

</div>

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)
```

---

<div class="post-metadata">

**Author:** ![Mark\_Liang](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/9e8a1a/32.png) [@Mark\_Liang](https://www.ruby-forum.com/u/Mark_Liang)\
**Post date:** [December 14, 2005, 4:52am UTC](https://www.ruby-forum.com/t/undefined-method/50198/2 "2005-12-14T04:52:31Z")

</div>

Hi –

On Wed, 14 Dec 2005, Mark Liang wrote:

> …/creat.rb:25:in `blkcheck': undefined method`[]’ for nil:NilClass
> 
> ```
> 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
> 
> ```

I’m not sure why you would need 1 there. If you’re just testing the  
truth value, then you’d want simply:

num == 9

If you need to return an integer value then be warned that if the  
condition fails, you’ll be returning a non-integer, namely nil.

> ```
> 30 def blkscheck (tab)
> 31 num = 0
> 32 Blk.each do |i,j|
> 33 num += 1 if blkcheck(tab,i,j)
> 
> ```

On the third iteration, j is 6. That means that in blkcheck, i+k+j is  
eventually going to add up to 9. Since tab only has nine elements,  
there’s no tab[9]. tab[9] is nil, so when you do tab[9][j+k] you’re  
calling [] on nil.

> ```
> 44 #blkscheck(val)
> 45 print "Hello world!\n" unless blkscheck(val)
> 
> ```

Discover the joys of ‘puts’ 🙂

David

–  
David A. Black  
removed\_email\_address@domain.invalid

“Ruby for Rails”, forthcoming from Manning Publications, April 2006!

---

<div class="post-metadata">

**Author:** ![Mark\_Liang](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/9e8a1a/32.png) [@Mark\_Liang](https://www.ruby-forum.com/u/Mark_Liang)\
**Post date:** [December 14, 2005, 6:01am UTC](https://www.ruby-forum.com/t/undefined-method/50198/3 "2005-12-14T06:01:35Z")

</div>

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 🙂

---

<div class="post-metadata">

**Author:** ![Mark\_Liang](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/9e8a1a/32.png) [@Mark\_Liang](https://www.ruby-forum.com/u/Mark_Liang)\
**Post date:** [December 14, 2005, 4:30pm UTC](https://www.ruby-forum.com/t/undefined-method/50198/4 "2005-12-14T16:30:28Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Mark\_Liang](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/9e8a1a/32.png) [@Mark\_Liang](https://www.ruby-forum.com/u/Mark_Liang)\
**Post date:** [December 14, 2005, 6:18pm UTC](https://www.ruby-forum.com/t/undefined-method/50198/5 "2005-12-14T18:18:51Z")

</div>

On 12/14/05, Tom R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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 F.

---

<div class="post-metadata">

**Author:** ![Mark\_Liang](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/9e8a1a/32.png) [@Mark\_Liang](https://www.ruby-forum.com/u/Mark_Liang)\
**Post date:** [December 19, 2005, 1:56am UTC](https://www.ruby-forum.com/t/undefined-method/50198/6 "2005-12-19T01:56:53Z")

</div>

Jacob F. wrote:

> 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.

I’ll second that and quote Dave and Andy:  
“Crash Early”  
V.-

–  
[http://www.braveworld.net/riva](http://www.braveworld.net/riva)
