2014-02-25 38 views
0

我有一个方法,试图解析一个查询到哈希。奇怪的行为与哈希在红宝石

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}] 

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

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

回答

2

更改线路

body = [{}]*query.length 

上述手段,要创建阵列,其元素是相同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) { {} } 

但上面的手段,要创建阵列,其元素是不同Hash对象。

实施例:

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

是否第一定义创建n个哈希值,其指向在存储器中的相同地址? –