質問: 初めまして、rubyでデータクローリングを勉強しているものです。 rubyによる開発技法という本をもとに勉強しているのですが、ソースコードの一部が調べても理解できなかったため質問させていただきました。 zipメソッドが、配列の要素を引数の配列の要素と組み合わせ、配列の配列を作成して返す。ということは理解できたのですがそれ以降の部分が理解できません。 以下のコードの意味について教えていただけたらと思います お願いします。 ``` url_titles.zip(dates).map{|(aurl, atitle), ymd|[CGI.unescapeHTML(aurl), CGI.unescapeHTML(atitle), Time.local(*ymd)] } ```
回答: ちょっとコードが汚いんで書き換えました。 変数名も短くしました。 ``` # %w[1 2 3]は['1', '2', '3']と同じ arr1 = [%w[a b], %w[c d], %w[e f]] arr2 = [%w[1 2 3], %w[4 5 6], %w[7 8 9]] arr1.zip arr2 #=> [[["a", "b"], ["1", "2", "3"]], [["c", "d"], ["4", "5", "6"]], [["e", "f"], ["7", "8", "9"]]] # ここまでは理解済み # それぞれブロック引数にレシーバーの要素が入る # ()で囲われた部分は要素1つを取り、分解される # (x, y)=>(["a", "b"]), z=>["1", "2", "3"]で要素を取ってx=>"a", y=>"b", z=>["1", "2", "3"]となる arr1.zip(arr2).map { |(x, y), z| { x: x, y: y, z: z } } #=> [{:x=>"a", :y=>"b", :z=>["1", "2", "3"]}, {:x=>"c", :y=>"d", :z=>["4", "5", "6"]}, {:x=>"e", :y=>"f", :z=>["7", "8", "9"]}] # 実行結果が配列の要素になる arr1.zip(arr2).map do |(x, y), z| [CGI.unescapeHTML(x), CGI.unescapeHTML(y), Time.local(*z)] end #=> [実行結果1(配列), 実行結果2,...] # ちなみに def disassembly(x, y, z) {x: x, y: y, z: z} end arr = %w[1 2 3] disassembly *arr #=> {:x=>"1", :y=>"2", :z=>"3"} # 引数に*をつけると分解されて引数になる ```