2011-05-31 19 views
5

Dado el siguiente script, veo una salida diferente usando Ruby 1.8.7 y Ruby 1.9.2. Mi pregunta es, ¿qué ha cambiado en los hashes de Ruby que impone este comportamiento en particular?Diferencia de Ruby Hash en 1.8.7 y 1.9.2

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 
  • Rubí 1.8.7 salida:

some_key=some_val&another_key=another_val

  • Rubí 1.9.2 salida:

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

1.9.2 conserva el tipo "Array" del valor, mientras que 1.8.7 cambia el tipo a cadena implícitamente.

+1

Parece peligroso agregar elementos a la misma colección sobre la que está iterando. –

Respuesta

7

Dos cosas han cambiado (siendo este último su observación):

  • hashes se ordenan ahora
  • array.to_s utilizan para devolver array.join, ahora se vuelve array.inspect (ver 1.8.7 y 1.9.2).
Cuestiones relacionadas