2011-05-31 16 views
5

Aşağıdaki betikte, Ruby 1.8.7 ve Ruby 1.9.2 kullanarak farklı bir çıktı görüyorum. Sorum şu: Bu özel davranışı uygulayan Ruby karmalarında ne değişti?Ruby Hash farkı 1.8.7 ve 1.9.2'de

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 çıkışı:

some_key=some_val&another_key=another_val

  • Ruby 1.9.2 çıkışı:

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

1.9.2, değerin "Array" türünü korur; oysa 1.8.7, türü örtülü olarak dizeye değiştirir.

+1

Yinelenen aynı koleksiyona öğe eklemek tehlikeli olabilir. –

cevap

7

İki şey (ikincisi sizin gözlem olmak üzere) değişti:

  • Hash'ler şimdi
  • array.to_s sipariş array.join dönmek için kullanılır, şimdi array.inspect (1.8.7 ve 1.9.2 bakınız) döndürür.