# Question about op. overloading

**URL:** <https://www.ruby-forum.com/t/question-about-op-overloading/154725>\
**Category:** Ruby\
**Created:** [December 3, 2008, 9:55am UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725 "2008-12-03T09:55:11Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 9:55am UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/1 "2008-12-03T09:55:11Z")

</div>

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)

---

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 10:10am UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/2 "2008-12-03T10:10:48Z")

</div>

JesÃºs Gabriel y GalÃ¡n wrote:

> Hope this helps,
> 
> Jesus.

So simple, I should have known. 🙂

Thank you!

–  
Maarten

---

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 10:20am UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/3 "2008-12-03T10:20:19Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 11:26am UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/4 "2008-12-03T11:26:29Z")

</div>

2008/12/3 Maarten M. [removed\_email\_address@domain.invalid](mailto: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

---

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 12:20pm UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/5 "2008-12-03T12:20:22Z")

</div>

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©

---

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 10:07am UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/6 "2008-12-03T10:07:48Z")

</div>

On Wed, Dec 3, 2008 at 9:49 AM, Maarten M.  
[removed\_email\_address@domain.invalid](mailto: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.

---

<div class="post-metadata">

**Author:** ![maartenm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/5e9695/32.png) [@maartenm](https://www.ruby-forum.com/u/maartenm)\
**Post date:** [December 3, 2008, 12:22pm UTC](https://www.ruby-forum.com/t/question-about-op-overloading/154725/7 "2008-12-03T12:22:52Z")

</div>

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.
