2014-02-25 2 views
0

쿼리를 해시로 구문 분석하는 방법이 있습니다.Ruby에서 해시를 사용하는 이상한 동작

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
는 요소가 동일한 개체 Hash 배열을 만드는 선을

body = [{}]*query.length 

상기 변경 수단

.

예 :

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 메모리에 동일한 주소 해시있는 점? –

관련 문제