2011-05-31 66 views
5

鑑於以下腳本,我使用Ruby 1.8.7和Ruby 1.9.2看到不同的輸出。我的問題是,Ruby哈希中改變了這種特定行爲的變化是什麼?紅寶石哈希差異在1.8.7和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 
  • 紅寶石1.8.7輸出:

some_key=some_val&another_key=another_val

  • 紅寶石1.9.2輸出:

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

1.9.2保留值的「數組」類型,而1.8.7將類型隱式地更改爲字符串。

+1

將元素添加到您正在迭代的相同集合看起來很危險。 – 2011-05-31 15:38:42

回答

7

兩件事情改變了(後者是你的觀察):

  • 散列現在
  • array.to_s排序用於返回array.join,現在它返回array.inspect(見1.8.71.9.2)。