ruby 1 lót để tạo ra băm

20 tháng 8 năm 2009 bởi Prashant · B́nh luận
Nộp theo: công nghệ

Hôm qua trong khi đi qua một trong các chương tŕnh cũ của tôi, tôi t́m thấy này được viết bởi tôi trở lại:

#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

Để giết một số bị đ́nh hoăn cho tôi tiết lộ rằng raw_text trông giống như

 

, Phải nó đă được cắt từ xác nhận thanh toán paypal.

Trên đường nếu bị phá vỡ trong các phần đọc tốt hơn:

  unescaped_array = CGI.unescape (raw_text). split ('&')
   unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (không) nếu b.size == 1;}
   flattened_array = unescaped_array.flatten
   hash = Hash [* flattened_array] 

Hăy để thực hiện các bước cá nhân trong IRB:

  irb (main): 009:0> unescaped_array = CGI.unescape (raw_text) chia ('&')    

 => ["SUCCESS", "mc_gross = 10.00", "protection_eligibility = không hợp lệ", "payer_id = U7PPJJ4TSJ47E", "thuế = 0.00", "payment_date = 09:45:30 ngày 10 Tháng Bảy 2009 PDT", "payment_status = chờ "]                                                                         

 irb (main): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (không) nếu b.size == 1;}  

 => [["SUCCESS", nil], ["mc_gross", "10,00"], ["protection_eligibility", "không hợp lệ"], ["payer_id", "U7PPJJ4TSJ47E"] ["thuế", "0.00"] ["payment_date", "09:45:30 ngày 10 tháng bảy 2009 PDT"], ["payment_status", "chờ"]]                               

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

 => ["SUCCESS", con số không, "mc_gross", "10,00", "protection_eligibility", "không hợp lệ", "payer_id", "U7PPJJ4TSJ47E", "thuế", "0.00", "payment_date", "09:45: 30 ngày 10 tháng 7 năm 2009 PDT "," payment_status "," chờ "]
 irb (main): 015:0>
 hash = Hash [* flattened_array]
 => {"Thuế" => "0.00", "payment_status" => "chờ", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "THÀNH CÔNG" => con số không, "payment_date" = > "09:45:30 Jul 10, 2009 PDT", "protection_eligibility" => "không hợp lệ"} 

BTW, * được gọi là nhà điều hành splat trong ruby

Một cách khác để tạo ra băm từ mảng của cặp 'là để sử dụng tiêm:

  hash = [[1,2], [3,4]] tiêm ({}). {| kết quả, yếu tố | kết quả [element.first] = kết quả [element.last]; kết quả} 

Có là một trong nhiều cách :) Viết một ṿng lặp, tôi sẽ để lại như một bài tập cho các độc giả!

Dưới đây là một chút trường hợp sử dụng không liên quan của việc tạo ra băm từ mảng:

  IRB (chính): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.  : Ít hơn :: lớn hơn}

 => {: Ít hơn => [1, 2, 3, 4]: lớn hơn => [7, 9]} 

Bạn có thể làm việc nhiều hơn, về cơ bản kết quả của khối được sử dụng như là ch́a khóa cho rằng phần tử trong bảng băm kết quả.