Ruby中哈希的奇怪行为

Ruby中哈希的奇怪行为,ruby,hash,Ruby,Hash,我有一个方法尝试将查询解析为哈希 CONTACT_SEARCH_FIELDS = ['LastUpdate','Name','RecAdd','PhoneNumber','Tag_Group','FirstName','LastName','FamilyName','FamilyHead','ClientStatus','ContactType','ClientSource','TaxId'] CONTACT_SEARCH_OPERANDS = ['=','>','<','!=','

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

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"]])
=> [{"Operand"=>0, "Value"=>"Smith", "Field"=>6}, {"Operand"=>0, "Value"=>"Smith", "Field"=>6}]
我做了一些调试,问题是数组中的所有哈希都是在每次迭代时设置的

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

更改行

body = [{}]*query.length
上面的意思是,您正在创建一个数组,其元素是相同的
Hash
对象

例如:

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

但是上面的意思是,您正在创建一个数组,它的元素是不同的
Hash
对象

例如:

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

第一个定义是否创建指向内存中相同地址的n个哈希?