Question about op. overloading


#1

I have:

class Sudoku
def
@rows[r][c]
end

def set(r,c,a)
@rows[r][c]=a
end
end

Now, how can I define a []= operator instead of the awkward set(r,c,a) ?
I want to be able to do
sudoku[2,3]=candidate

or even
sudoku[2][3] = candidate
and
sudoku[3] = row

Are these things possible? How, I could not find the information.

(I’m just learning, for educational reasons I don’t want to extend the
Matrix class)


#2

Jesús Gabriel y Galán wrote:

Hope this helps,

Jesus.

So simple, I should have known. :slight_smile:

Thank you!


Maarten


#3

What about
sudoku[r][c]= a
though?

Is that possible? I thought I’d be able to fluke it by overloading [] to
return an array. But how do I pass parameters inside the bracket?

And how woudl I get

puts sudoku[][3]

to return the third column?


#4

2008/12/3 Maarten M. removed_email_address@domain.invalid:

What about
sudoku[r][c]= a
though?

Is that possible? I thought I’d be able to fluke it by overloading [] to
return an array. But how do I pass parameters inside the bracket?

You do not need an array but rather a proxy:

class X
ColProxy = Struct.new :owner, :column do
def
owner.matrix[[column, row]]
end

def []=(row,val)
  owner.matrix[[column, row]] = val
end

end

attr_reader :matrix

def initialize
@matrix = {}
end

def
ColProxy.new(self, column)
end
end

irb(main):026:0> x = X.new
=> #<X:0x7ff5443c @matrix={}>
irb(main):027:0> x[1][2] = 3
=> 3
irb(main):028:0> x[1][2]
=> 3
irb(main):029:0> x
=> #<X:0x7ff5443c @matrix={[1, 2]=>3}>

And how woudl I get

puts sudoku[][3]

to return the third column?

You can do it similarly. Just make the argument for X#[] optional and
return another proxy.

I would really rather go with the other approach to stuff all
coordinates in a single pair of brackets and or provide additional
methods.

Kind regards

robert


#5

Maarten M. wrote:

What about
sudoku[r][c]= a
though?

Is that possible?

Simpler would be if you use sudoku[r,c] = a

Just define your []= method to take 3 arguments.

And how woudl I get

puts sudoku[][3]

to return the third column?

Again, your [] method can take 2 arguments. sudoku[nil,c] could be used
to give the column.

But I think a separate method for this makes more sense: sudoku.col©


#6

On Wed, Dec 3, 2008 at 9:49 AM, Maarten M.
removed_email_address@domain.invalid wrote:

end
Are these things possible? How, I could not find the information.
A []= operator is possible. It’s syntactic sugar for a method named
“[]=”
and at least two parameters: what’s inside the brackets and the
“assigned” value.

An example:

irb(main):001:0> class A
irb(main):002:1> def []= (a,b)
irb(main):003:2> @x[a] = b
irb(main):004:2> end
irb(main):005:1> attr_reader :x
irb(main):006:1> def initialize
irb(main):007:2> @x = {}
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> a = A.new
=> #<A:0xb7b2bfa8 @x={}>
irb(main):011:0> a[:a] = :b
=> :b
irb(main):012:0> a
=> #<A:0xb7b2bfa8 @x={:a=>:b}>

If you add more parameters to the method, you can use more “keys”
inside the brackets:

irb(main):013:0> class A
irb(main):014:1> def []= (a,b,c)
irb(main):015:2> puts a,b,c
irb(main):016:2> end
irb(main):017:1> end
=> nil
irb(main):018:0> a = A.new
=> #<A:0xb7b070f4 @x={}>
irb(main):019:0> a[:a,:b] = :c
a
b
c
=> :c

Hope this helps,

Jesus.


#7

Brian C. wrote:

But I think a separate method for this makes more sense: sudoku.col©

Yeah that’s what I did eventually.

To be honest I could’ve found all this stuff myself, I was confused by
the output ruby gave me and didn’t realize I just needed an extra
parameter.
Sorry and thanks to everyone.