Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby 1.9 Array.to_s behaves differently?

i wrote a quick little application that takes a base file of code with some keywords, a file of replacements for the keywords, and outputs a new file with the keywords replaced.

When i was using Ruby 1.8, my outputs would look fine. Now when using Ruby 1.9, my replaced code has the newline characters in it instead of line feeds.

For example, i see something like:

["\r\nDim RunningNormal_1 As Boolean", "\r\nDim RunningNormal_2 As Boolean", "\r\nDim RunningNormal_3 As Boolean"]

instead of:

Dim RunningNormal_1 As Boolean
Dim RunningNormal_2 As Boolean
Dim RunningNormal_3 As Boolean

i use a hash of replacements {"KEYWORD"=>["1","2","3"]} and an array of the replaced lines.

i use this block to finish the replacement:

resultingLibs.each do |x|
  libraryString.sub!(/(<REPEAT>(.*?)<\/REPEAT>)/im) do |match|
    x.each do |individual|
      individual.to_s 
    end
  end
end
#for each resulting group of the repeatable pattern,
#  
#Write out the resulting libs to a combined string

My hunch is that i'm printing out the array instead of the strings within the array. Any suggestions on a fix. When i debug and print my replaced string using puts, the output looks correct. When i use the to_s method (which is how my app writes the output to the output file), my output looks wrong.

A fix would be nice, but what i really want to know is what changed between Ruby 1.8 and 1.9 that causes this behavior. Has the to_s method changed somehow in Ruby 1.9?

*i'm inexperienced in Ruby

like image 533
jrsconfitto Avatar asked Oct 18 '10 14:10

jrsconfitto


2 Answers

Yes, you're calling to_s on an array of strings. In 1.8 that is equivalent to calling join, in 1.9 it is equivalent to calling inspect.

To get the behavior you want in both 1.8 and 1.9, call join instead of to_s.

like image 100
sepp2k Avatar answered Nov 15 '22 06:11

sepp2k


Please see here, under Array

Array#to_s is equivalent to Array#inspect

[1,2,3,4].to_s                                    # => "[1, 2, 3, 4]"

instead of

RUBY_VERSION                                      # => "1.8.5"
[1,2,3,4].to_s                                    # => "1234"
like image 32
ghostdog74 Avatar answered Nov 15 '22 06:11

ghostdog74