The difference in Ruby Hash is 1.8.7 and 1.9.2

Given the following script, I see another output using Ruby 1.8.7 and Ruby 1.9.2. My question is, what has changed in the ruby ​​hashes that provide this particular behavior?

def to_params(_hash)
  params = ''
  stack = []

  _hash.each do |k, v|
    if v.is_a?(Hash)
      stack << [k,v]
    else
      #v = v.first if v.is_a?(Array)
      params << "#{k}=#{v}&"
    end
  end

  stack.each do |parent, hash|
    hash.each do |k, v|
      if v.is_a?(Hash)
        stack << ["#{parent}[#{k}]", v]
      else
        params << "#{parent}[#{k}]=#{v}&"
      end
    end
  end

  params.chop! # trailing &
  params
end

q = {"some_key"=>["some_val"], "another_key"=>["another_val"]}
n = convert_params(q)

puts n
  • Ruby 1.8.7 output:

some_key=some_val&another_key=another_val

  • Ruby 1.9.2 output:

some_key=["some_val"]&another_key=["another_val"]

1.9.2 stores the type of "Array" value, while 1.8.7 implicitly changes the type to a string.

+5
source share
1 answer

Two things have changed (the last is your observation):

  • Now hashes are ordered
  • array.to_sused to return array.join, now it returns array.inspect(see 1.8.7 and 1.9 0.2 ).
+7
source

All Articles