From: Robert Klemme Date: 2009-04-20T20:02:32+09:00 Subject: Re: Hashed matrix 2009/4/20 Robert Klemme : > 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 This should have read raise ArgumentError, "Not a state %p" % val unless State === 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/ > -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/