Hello, I'd like to use a specific matrix with string as key for lines
and integer index for columns. I could also use string for columns (a
string version of integer), it doesn't matter. I use the matrix to store
a small object (named State) I just need to access data like that :
matrix[a_string][a_number]
Here is how I tried to do it :
matrix = Hash.new{ |hash, key| hash[key] = Array.new(5, State.new(0,
"")) }
But I have strange values, is there a better way to make that matrix ?
···
--
Posted via http://www.ruby-forum.com/.
You want the block form of Array.new because otherwise all array
entries point to the same object:
matrix = Hash.new{ |hash, key| hash[key] = Array.new(5) { State.new(0,"") } }
Alternative approach: use an Array of String and Fixnum as Hash key:
class Matrix
def initialize
@hash = Hash.new {|h,k| h[k] = State.new(0, "")}
end
def (row,col)
@hash[[row, col]]
end
def =(row,col, val)
raise ArgumentError, "Not a state %p" % val
@hash[[row, col]] = val
end
end
This is likely more efficient if your matrices are large and sparse.
Kind regards
robert
···
2009/4/20 Yoann Moreau <yoni612@hotmail.com>:
Hello, I'd like to use a specific matrix with string as key for lines
and integer index for columns. I could also use string for columns (a
string version of integer), it doesn't matter. I use the matrix to store
a small object (named State) I just need to access data like that :
matrix[a_string][a_number]
Here is how I tried to do it :
matrix = Hash.new{ |hash, key| hash[key] = Array.new(5, State.new(0,
"")) }
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
Hello, I'd like to use a specific matrix with string as key for lines
and integer index for columns. I could also use string for columns (a
string version of integer), it doesn't matter. I use the matrix to store
a small object (named State) I just need to access data like that :
matrix[a_string][a_number]
Here is how I tried to do it :
matrix = Hash.new{ |hash, key| hash[key] = Array.new(5, State.new(0,
"")) }
You want the block form of Array.new because otherwise all array
entries point to the same object:
matrix = Hash.new{ |hash, key| hash[key] = Array.new(5) { State.new(0,"") } }
Alternative approach: use an Array of String and Fixnum as Hash key:
class Matrix
def initialize
@hash = Hash.new {|h,k| h[k] = State.new(0, "")}
end
def (row,col)
@hash[[row, col]]
end
def =(row,col, val)
raise ArgumentError, "Not a state %p" % val
This should have read
raise ArgumentError, "Not a state %p" % val unless State === val
···
2009/4/20 Robert Klemme <shortcutter@googlemail.com>:
2009/4/20 Yoann Moreau <yoni612@hotmail.com>:
@hash[[row, col]] = val
end
end
This is likely more efficient if your matrices are large and sparse.
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
Thanks for your answer, you're right I had the same object in my array,
this is why I had strange values.
I use a really small matrix so it's not a big deal to be efficient, I'll
use your first idea.
Thank you.
···
--
Posted via http://www.ruby-forum.com/.