今日はじめて知ったこと

引数の展開

def f1 a,c; p a; p c; end
def f2 a,*c; p a; pc; end
f1(1,2,3,4,5)
  #=> ArgumentsError
f2(1,2,3,4,5)
 #=> 1
 #=> [2,3,4,5]

Hashの[]メソッド

クラスメソッドかインスタンスメソッドかで挙動がだいぶ違う

"key value"から「{keyA=>valueA ... keyZ=>valueZ}」前にやってた

上の二つを使うと簡単に創ることができるようになる。
Hash[*("A".."Z").map {alf| "key value".split.map {|e| e.concat(alf)}}.flatten]

#前のを一行にしたもの
("A".."Z").map {|alf| k,v = "key value".split.map {|e| e+alf}; k.concat(" "+v)}.inject(Hash.new) {|h,e| k,v=e.split; h[k]=v; h}

hash.[]便利!!

でも少し考えてみると

途中で["keyA valueA"]に戻す必要ない(下の方)

これで十分
("A".."Z").map {|alf| k,v = "key value".split.map {|e| e.concat alf}}.inject(Hash.new) {|h,e| h[e[0]]=e[1]; h}

どっちがいいかは気分しだい?*3

*1:Hash[key1,value1,key2,value2] のように使う

*2:Hash[key] キーから値を引くときに使う

*3:h[e[0] ]とか分かり辛いかもしれない