루비 하나 라이너는 해시 생성

에 의해 2009년 8월 20일 prashant · 댓글
: 아래에 제출한 기술

어제의 내 오래된 프로그램 중 하나를 겪고있는 동안,이 가끔 날 다시 작성한 발견 :

#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic

서스펜스의 일부를 죽이는 것은 나를 raw_text가 어떻게 생겼 것을 공개하자

 

마우스 오른쪽 그것은 페이팔 지불 확인서에서 컷되었습니다.

라인 위 부분에 깨진 경우 더 읽습니다 :

  unescaped_array = CGI.unescape (raw_text가). ('&') 분할
   unescaped_array = unescaped_array.collect {| X | B = x.split ("="); b.push (전무) 경우 b.size == 1, B}
   flattened_array = unescaped_array.flatten
   해시 = 해시 [* flattened_array] 

하자 irb에서 각 단계를 수행합니다

  irb (주). 009:0> unescaped_array = CGI.unescape (raw_text) 분할 ('&')    

 => [ "성공", "mc_gross = 10.00", "protection_eligibility = 부적합", "payer_id = U7PPJJ4TSJ47E", "세금 = 0.00", "payment_date = 9시 45분 30초 2009 7월 10일, 태평양 서머 타임", "payment_status은 = 보류 중 "]                                                                         

 irb (주) : 013:0> unescaped_array = unescaped_array.map {| X | B = x.split ("="); b.push (전무) 경우 b.size == 1, B}  

 => [[ "성공", 전무], [ "mc_gross", "10.00 "],["의 protection_eligibility", "부적합"] [ "payer_id", "U7PPJJ4TSJ47E"] [ "세금", "0.00"] , [ "payment_date", "9시 45분 30초 2009년 7월 10일 PDT는"] [ "payment_status", "보류"]]                               

 irb (주) : 014:0> flattened_array = unescaped_array.flatten     

 => [ "성공", 전무, "mc_gross", "10.00", "protection_eligibility", "부적합", "payer_id", "U7PPJJ4TSJ47E", "세금", "0.00", "payment_date", "9시 45분 : 30 2009 7월 10일, 태평양 서머 타임 ","payment_status은 "", "보류]
 irb (주) : 015:0>
 해시 = 해시 [* flattened_array]
 => { "세금"= "payment_status"=> "보류"> "0.00", "payer_id"=> "U7PPJJ4TSJ47E", "mc_gross"=> "10.00", "성공"=> 전무, "payment_date"= > "9시 45분 30초 2009년 7월 10일 PDT", "protection_eligibility"=> "부적합"} 

BTW, *는 루비의 표시와 연산자라고합니다

'쌍 배열'에서 해시를 만드는 또 다른 방법은 주사를 사용하는 것입니다 :

  해시 = [[1,2], [3,4]] ({}){| 결과를 삽입, 요소 | 결과 [element.first] = 결과 [element.last];.} 결과 

하나 더 방법이 있습니다 :) 나는 독자들에게 운동으로 떠날 것을 루프를주세요!

여기 배열의 해시를 만드는 약간의 관련이없는 유스 케이스는 다음과 같습니다

  irb (주) : 005:0> [1,2,3,4,7,9] group_by {| X | X <5.?  : 후진 : : 큰}

 => {: 시시한 => [1, 2, 3, 4] : 큰 => [7, 9]} 

당신은 기본적으로 블록의 결과가 결과 해시에 요소에 대한 열쇠로 사용되며, 더 많은 것들을 할 수 있습니다.