Matrix-element extractor -- How to define it

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

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_(*args)
  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

Dan

···

On Sat, May 3, 2008 at 4:05 PM, RichardOnRails <RichardDummyMailbox58407@uscomputergurus.com> wrote:

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

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_(*args)
  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

Dan

> 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

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" :slight_smile:

    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

···

On May 3, 9:06 pm, Daniel Finnie <d...@danfinnie.com> wrote:

On Sat, May 3, 2008 at 4:05 PM, RichardOnRails > > <RichardDummyMailbox58...@uscomputergurus.com> wrote:

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.

···

On May 4, 4:38 pm, RichardOnRails <RichardDummyMailbox58...@uscomputergurus.com> wrote:

On May 3, 9:06 pm, Daniel Finnie <d...@danfinnie.com> wrote:

> 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_(*args)
> 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

> Dan

> On Sat, May 3, 2008 at 4:05 PM, RichardOnRails > > > <RichardDummyMailbox58...@uscomputergurus.com> wrote:
> > 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

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" :slight_smile:

> 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

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 <RichardDummyMailbox58407@uscomputergurus.com> wrote:

On May 3, 9:06 pm, Daniel Finnie <d...@danfinnie.com> wrote:
> 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_(*args)
> 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
>
> Dan
>
> On Sat, May 3, 2008 at 4:05 PM, RichardOnRails > > > > > <RichardDummyMailbox58...@uscomputergurus.com> wrote:
> > 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

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" :slight_smile:

> 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

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

> > 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_(*args)
> > 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

> > Dan

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

> 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" :slight_smile:

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

Hi Daniel,

Thanks for your additional response.

misguided

No problem! I misguide myself all the time :slight_smile: 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_(*args)" 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!

···

On May 4, 5:44 pm, Daniel Finnie <d...@danfinnie.com> wrote:

On Sun, May 4, 2008 at 4:40 PM, RichardOnRails > > <RichardDummyMailbox58...@uscomputergurus.com> wrote:
> On May 3, 9:06 pm, Daniel Finnie <d...@danfinnie.com> wrote:
> > On Sat, May 3, 2008 at 4:05 PM, RichardOnRails > > > > <RichardDummyMailbox58...@uscomputergurus.com> wrote: