해시 만들 루비 한 라이너
내 옛날 프로그램 중 하나를 통해 가고있는 동안 어제,이 상황이 언제 나한테 의해 작성된 발견 :
#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일 PDT", "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분 : 7월 30일 10, 태평양 서머 타임 20시 09분 ","payment_status ","보류 중 "] irb (주) : 015:0> 해시 = 해시 [* flattened_array] => { "세금"=> "0.00", "payment_status"=> "보류 중" "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]}
당신은 기본적으로 블록의 결과가 결과 해시에서 해당 요소에 대한 키로 사용되며, 더 많은 일을 할 수있다.



































