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)
Jesús Gabriel y Galán wrote:
Hope this helps,
Jesus.
So simple, I should have known. 
Thank you!
–
Maarten
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?
2008/12/3 Maarten M. [email protected]:
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
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©
On Wed, Dec 3, 2008 at 9:49 AM, Maarten M.
[email protected] 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.
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.