From: Robert Klemme Date: 2009-04-20T20:01:57+09:00 Subject: Re: Hashed matrix 2009/4/20 Yoann Moreau : > 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 @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/