Ruby中哈希的奇怪行为

时间:2014-02-25 08:19:22

标签: ruby hash

我有一个尝试将查询解析为哈希的方法。

CONTACT_SEARCH_FIELDS = ['LastUpdate','Name','RecAdd','PhoneNumber','Tag_Group','FirstName','LastName','FamilyName','FamilyHead','ClientStatus','ContactType','ClientSource','TaxId']
CONTACT_SEARCH_OPERANDS = ['=','>','<','!=','Like','BeginsWith','IsEmpty']

def search (query, page = 1)
    body = [{}]*query.length
    query.each_with_index do |expr, i|
        body[i]["Field"] = CONTACT_SEARCH_FIELDS.index expr[0]
        body[i]["Operand"] = CONTACT_SEARCH_OPERANDS.index expr[1]
        body[i]["Value"] = expr[2]
    end
    return body
end

该方法就像这样调用

search([["FirstName", "=", "John"], ["LastName", "=", "Smith"]])

问题是运行它会产生非常奇怪的输出。

search([["FirstName", "=", "John"], ["LastName", "=", "Smith"]])
=> [{"Operand"=>0, "Value"=>"Smith", "Field"=>6}, {"Operand"=>0, "Value"=>"Smith", "Field"=>6}]

我做了一些调试,问题是数组中的所有哈希都是在每次迭代时设置的。

我不明白这背后的原因是什么。我也欢迎此代码的任何更短或更好的版本。

1 个答案:

答案 0 :(得分:2)

更改行

body = [{}]*query.length

上述方法是,您正在创建一个 Array ,其元素是相同的Hash个对象。

示例:

a = [{}]*3 # => [{}, {}, {}]
a.map(&:object_id) # => [18499356, 18499356, 18499356]
a[0]["a"] = 2
a # => [{"a"=>2}, {"a"=>2}, {"a"=>2}]

body = Array.new(query.length) { {} }

但上述意思是,您正在创建一个 Array ,其元素是不同的Hash个对象。

示例:

a = Array.new(3) { {} } # => [{}, {}, {}]
a.map(&:object_id) # => [17643864, 17643852, 17643840]
a[0]["a"] = 2
a # => [{"a"=>2}, {}, {}]