ルビーハッシュを作成する1つのライナー

によって2009年8月20日プラシャント · コメント
の下でファイルされる: 技術

私の古いプログラムのひとつを通過しながら、昨日、私はこれがいつか戻って私によって書かれました:

#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ように見えることを開示してみましょう

 

、右のそれはPayPalの支払い承認からカットされています。

線の上の部分で壊れた場合には、優れた読み取ります。

  unescaped_array = CGI.unescape(RAW_TEXT)。分割( '&')
   unescaped_array = unescaped_array.collect {| x |はB = x.split( "="); b.push(nil)はb.size == 1であれば、B}
   flattened_array = unescaped_array.flatten
  ハッシュ=ハッシュ[* flattened_array] 

irbで個々の手順を実行してみましょう:

  IRB(メイン):009:0> unescaped_array = CGI.unescape(RAW_TEXT)スプリット( '&')    

 => ["SUCCESS"、 "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(nil)はb.size == 1であれば、B}  

 => ["SUCCESS"は、nil]、["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     

 => ["SUCCESS"は、nil、 "mc_gross"、 "10.00"、 "protection_eligibility"、 "不適格"、 "payer_id"、 "U7PPJJ4TSJ47E"、 "税"、 "0.00"、 "payment_date"、 "9時45分: 30 2009年7月10日PDT "、" PAYMENT_STATUS "、"保留中 "]
 IRB(メイン):015:0>
ハッシュ=ハッシュ[* flattened_array]
 => {"税" => "0.00"、 "PAYMENT_STATUS" => "保留中"、 "payer_id" => "U7PPJJ4TSJ47E"、 "mc_gross" => "10.00"、 "SUCCESS" => nilで、 "payment_date" = > "9時45分30秒2009年7月10日PDT"、 "protection_eligibility" => "不適格"} 

ところで、*はRubyでスプラット演算子と呼ばれ

'のペアの配列 "からハッシュを作成する別の方法は、注入を使用することです。

 ハッシュ= [[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]} 

基本的には、ブロックの結果、得られたハッシュでその要素のキーとして使用され、より多くのことを行うことができます。