# Matrix-element extractor -- How to define it

**URL:** <https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578>\
**Category:** Ruby\
**Created:** [May 3, 2008, 10:06pm UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578 "2008-05-03T22:06:03Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 3, 2008, 10:06pm UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578/1 "2008-05-03T22:06:03Z")

</div>

Hi,

I defined and populated a 9x9 matrix (Array of Arrays) of strings, m

I defined an element-extractor:

class Array  
def get(i,j)  
line =self[i-1]  
char = line[j-1]  
end  
end

To get the first element of the second row, I used the following,  
which worked fine:

m.get(2,1)

I’d like to write merely m(2,1). How can I do that simply?

Thanks in Advance,  
Richard

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 4, 2008, 3:06am UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578/2 "2008-05-04T03:06:43Z")

</div>

Hi,

You do this:  
class Array  
alias old\_[] []  
def [] \*args  
if \*args.length == 2 && args[0].is\_a? Integer && args[1].is\_a?  
Integer  
get(\*args)  
else  
old\_  
end  
end

Of course, this would remove some of the functionality of an Array for  
every Array, not just matricies. Consider making a subclass of Array  
like this:  
class Matrix \< Array  
…  
end

Now you can modify Matrix at will without affecting Array.

If you are creating a Matrix for purely pragmatic reasons (i.e., not  
as an excercise) then there is an excellent Matrix class in the Ruby  
standard library: [RDoc Documentation](http://ruby-doc.org/stdlib/)

Dan

On Sat, May 3, 2008 at 4:05 PM, RichardOnRails

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 4, 2008, 10:40pm UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578/3 "2008-05-04T22:40:50Z")

</div>

On May 3, 9:06 pm, Daniel F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end
> 
> > To get the first element of the second row, I used the following,  
> > which worked fine:
> 
> > m.get(2,1)
> 
> > I’d like to write merely m(2,1). How can I do that simply?
> 
> > Thanks in Advance,  
> > Richard

Hi Daniel,

Thanks for the “kick start” and the Matrix class. I got the latter  
working, but I’m going to “roll my own” because I want a Sudoku  
solver that works the way I do manually. I know there’s a free solver  
written in VisualProlog, but like Frank Sinatra, “I’ll do it my  
way” 🙂

> ```
> alias old_[] []
> 
> ```

I’m running ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]. It  
barfed on “old\_”, so I substituted:  
else  
super(\*args)  
which worked fine.

Best wishes,  
Richard

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 4, 2008, 10:45pm UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578/4 "2008-05-04T22:45:31Z")

</div>

On May 4, 4:38 pm, RichardOnRails  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ```
> > if *args.length == 2 && args[0].is_a? Integer && args[1].is_a? Integer
> > 
> > ```
> > 
> > …  
> > On Sat, May 3, 2008 at 4:05 PM, RichardOnRails
> > 
> > > ```
> > > line =self[i-1]
> > > 
> > > ```
> 
> > ```
> > alias old_[] []
> > 
> > ```
> 
> I’m running ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]. It  
> barfed on “old\_”, so I substituted:  
> else  
> super(\*args)  
> which worked fine.
> 
> Best wishes,  
> Richard

I should have mentioned that I used "alias old\_[] [] " in the context  
of “Matrix \< Array”, so there’s no wonder it didn’t work. Sorry about  
that omission.

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 4, 2008, 11:45pm UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578/5 "2008-05-04T23:45:53Z")

</div>

Hi again,

I’m glad super worked out for you. That’s the “right way” to do it  
for inheritance.

I have a feeling I may have misguided you with the “alias old\_[] []”  
line. It should probably be something like “alias old\_brackets []” as  
I doubt that old\_[] is a valid method name (I just checked and it  
isn’t, to be sure).

Dan

On Sun, May 4, 2008 at 4:40 PM, RichardOnRails

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 5, 2008, 5:40am UTC](https://www.ruby-forum.com/t/matrix-element-extractor-how-to-define-it/136578/6 "2008-05-05T05:40:49Z")

</div>

On May 4, 5:44 pm, Daniel F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Dan
> 
> > > def [] \*args  
> > > class Matrix \< Array
> 
> > > > ```
> > > > def get(i,j)
> > > > 
> > > > ```
> > > > 
> > > > I’d like to write merely m(2,1). How can I do that simply?  
> > > > way" 🙂  
> > > > Richard  
> > > > Hi Daniel,

Thanks for your additional response.

> misguided

No problem! I misguide myself all the time 🙂 Any, it’s history.

I’ve got two questions about my current version of your code, which  
works fine BTW.

1. Where is the get method come from. I looked in Ruby RDoc and (i)  
see no get method for Array, nor (ii) any related get method on the  
Methods section of the RDoc. I’d really like a pointer to it’s  
documentation. It certainly is useful in this context.

2. As I mentioned, I switched from “old\_” in the else  
clause to “super \*args”. which works fine for the most part. I works  
fine, too, except I want to substitute “raise ‘invalid data’” or  
something more descriptive. Unfortunately, when I do that I get a  
syntax error.

If you have the time, I’d love to get your take on these issues.  
Code and output is below for your convenience.

Best wishes,  
Richard

class Matrix \< Array  
def [] \*args  
if (args.length == 2) && args[0].is\_a?(Integer) && args[1].is\_a?  
(Integer)  
get(\*args)  
else  
super \*args  
end  
end  
end

m = Matrix[[10,20,30], [40,50,60], [70,80,90] ];  
puts m [0] [1] # 20  
puts m [2] [0] # 70  
puts m[1] # 40  
# 50  
# 60

# This displayed nicely in my browser (Firefox 2.0). I hope it does

in yours!
