Dave Snowdon wrote:
> Hi folks
> 
> I'm working on some code that extracts data from a set of XML files 
> using REXML stores this as arrays of arrays of floats (one array of 
> floats per file), does some processing and then writes the results to 4 
> text files for visualisation with gnuplot.
> 
> However, what happens is that although 4 files get created all the data 
> gets saved in the first one to be opened. It's as if the block in 
> writeMatrix() stores the reference to the first File object and uses 
> that on the other 3 method invocations. If that's the case then I've 
> obviously failed to understand the appropriate way to use a block.
> 
> What would be a better way to code this in ruby?

Hi,

So I took your code, made it look more like Ruby code (snake_case), 
simplified it, added example data and ran it. The resulting files were 
all as I think they should be. The problem you are having has to lie 
somewhere else in your code. Are you shure the class variables 
*_DATA_FILE are right, or maybe they all contain the same file name?

Anyway, here's the code:


class TuneInputData

   @@LUMINANCE_DATA_FILE     = "luminance.data"
   @@VOICE_DATA_FILE         = "voice.data"
   @@SOUND_DATA_FILE         = "sound.data"
   @@RHYTHM_DATA_FILE        = "rhythm.data"
   @@COLOURFULNESS_DATA_FILE = "colourfulness.data"

   def initialize
     @image_vector  = [[1, 2, 3], [3, 2, 1]]
     @voice_vector  = [[4, 5, 6], [6, 5, 4]]
     @sound_vector  = [[7, 8, 9], [9, 8, 7]]
     @rhythm_vector = [[10, 11, 12], [12, 11, 10]]
   end

   def write_data
     write_matrix(@@LUMINANCE_DATA_FILE, @image_vector)
     write_matrix(@@VOICE_DATA_FILE, @voice_vector)
     write_matrix(@@SOUND_DATA_FILE, @sound_vector)
     write_matrix(@@RHYTHM_DATA_FILE, @rhythm_vector)
     # write_column(@@COLOURFULNESS_DATA_FILE, @image_colourfulness)
   end

   def write_matrix(filename, matrix)
     File.open(filename, 'w') do |file|
       file.puts matrix.collect{ |row| row.join(' ') }
     end
   end

end

t = TuneInputData.new
t.write_data


Hope it helped,
   Robin