読みやすさを考えてみる。

どこかのブログで「"keyA valueA"」から「"keyA"=>"valueA"」のハッシュをつくっている所があった。それを「key value」という文字列から作ってみる。

こんな感じの処理をする

  1. "key value"という文字列を作成
  2. ["keyA valueA", "keyA valueB", …]という配列を生成
  3. keyA=>valueAという組になっているハッシュを生成
"key value" #こんな文字列から
=>{"keyA"=>"valueA", "keyB"=>"valueB", "keyC"=>"valueC", "keyD"=>"valueD", "keyE"=>"valueE", "keyF"=>"valueF", "keyG"=>"valueG", "keyH"=>"valueH", "keyI"=>"valueI", "keyJ"=>"valueJ", "keyK"=>"valueK", "keyL"=>"valueL", "keyM"=>"valueM", "keyN"=>"valueN", "keyO"=>"valueO", "keyP"=>"valueP", "keyQ"=>"valueQ", "keyR"=>"valueR", "keyS"=>"valueS", "keyT"=>"valueT", "keyU"=>"valueU", "keyV"=>"valueV", "keyW"=>"valueW", "keyX"=>"valueX", "keyY"=>"valueY", "keyZ"=>"valueZ"} #こんな感じのハッシュを作成 

(ハッシュは順不同なので、実際に生成されたハッシュをpメソッドなどで表示した場合には、上のようにキレイに昇順に表示されることはありません)

最初に書いたコード

str="key value"                 #始めの文字列
arr = ("a".."z").map do |alf|  #ここら辺でアルファベットを追加
	k,v = str.split
	alf = alf.upcase
	k,v = k+alf,v+alf
	k.concat(" "+v)
end
str = arr.inject(Hash.new) do |h, e| #この辺で配列からハッシュに変更
	k, v = e.split
	h[k] = v
	h
end
p str

次に書いたコード

str = "key value"	
arr = ("a".."z").map {|alf| k,v = str.split.map {|e| e+alf.upcase}; k.concat(" "+v)}
p arr.inject(Hash.new) {|h,e| k,v=e.split; h[k]=v; h}

何が書いてあるのかわけ分からなくなった。まるで呪文だ。
一つの処理ごとに関数へ置き換えると見やすくなるかもしれない

最終的なコード

def add_capital_letter(str)
  ("a".."z").map {|alf| k,v = str.split.map {|e| e+alf.upcase}; k.concat(" "+v)}
end

def array_to_hash(arr)
  arr.inject(Hash.new) {|h,e| k,v=e.split; h[k]=v; h}
end

def main
  str = "key value"	
  p (array_to_hash(add_capital_letter(str))
end
main

名前のせいかな?あんまり見やすくなっていない(;ω;)

補則

rubyだと

def f(hoge)
  return hoge
end
def f hoge
  hoge
end

は等価。
mapは配列を返すから、add_captal_letterメソッドの返す値は上2つの「arr」と同じ。