2011-05-31 45 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)。