FrontPage  Index  Search  Changes  RSS  wikifarm  Login

Enumerable_to_hash.rb

概要

Enumerable#to_hash メソッドを追加します。 Hash#to_a の逆です。二重配列で内部配列の要素が2つである必要があります。

ブロックを付けて2つの要素の配列を返す方法もあります。

Struct#to_hash は{メンバー名=>その値} を返します。


依存性

  1. Linux でも Windowsでもつかえます。

利用者

  1. SymHash.rb

実行見本:

1.jpg

説明


コメントがありましたらどうぞ

(comment plugin is disabled).

ソース:

Enumerable_to_hash.rb

#! ruby -Ks
#-- Enumerable_to_hash.rb
#-- Enumerable_to_hash.pi

module Enumerable
  def to_hash
    ret = {}
    if block_given?
      each{ |i|
        k,v = i = yield(i) ;
        i.is_a?(Hash) ? ret.update(i) : ret[k] = v unless i.nil?
      }
    else
      each{ |k,v| ret[k] = v }
    end
    ret
  end
end

class Hash
  def to_hash
    return self unless block_given?
    ret = {}
    each{ |i|
      k,v = i = yield(i)
      i.is_a?(Hash) ? ret.update(i) : ret[k] = v unless i.nil?
    }
    ret
  end
end

class Struct
  def to_hash
    members.to_hash{|m| [m.intern, self[m]]}
  end
end

if __FILE__ == $0

h = {:a=>11, :b=>"22", :c=>33, :d=>nil}
p h
#=> {:d=>nil, :a=>11, :b=>"22", :c=>33}
ar = h.to_a
p ar    
#=> [[:d, nil], [:a, 11], [:b, "22"], [:c, 33]]

p "--  Hash#to_a の逆変換 ar.to_hash"
p ar.to_hash
#=> {:d=>nil, :a=>11, :b=>"22", :c=>33}

p "--  Hash#to_a の逆変換 .. ar.to_hash は ar.to_hash{|k,v| [ k , v ] } と同じ"
p ar.to_hash{|k,v| [ k , v ] }
#=> {:d=>nil, :a=>11, :b=>"22", :c=>33}

p "--  Hash#to_a の逆変換 .. ar.to_hash{|k,v| [ v , k ] } なら Hash#invertとほぼ同じ"
p ar.to_hash{|k,v| [ v , k ] }
#=> {"22"=>:b, 33=>:c, 11=>:a, nil=>:d}
p "h.invert"
p h.invert

p "--  ハッシュの作りなおし。Strin#* Integer#* はあるが NilClass#* はない"
p h.to_hash{|k,v| [k , defined?(v.*) ? v*2 : v] }
#=> {:d=>nil, :a=>22, :b=>"2222", :c=>66}

p "--  キーの変更。シンボルを文字列に変更"
p h.to_hash{|k,v| [k.to_s.upcase , v] }
#=> {"A"=>11, "B"=>"22", "C"=>33, "D"=>nil}

p "--  配列を加工してハッシュを作成。"
p ar.to_hash{|k,v| [k, k.to_s.upcase] }
#=> {:d=>"D", :a=>"A", :b=>"B", :c=>"C"}

p "-- Struct#to_hash は{メンバー名=>その値} を返す"
struct = Struct.new(:a,:b,:c)
p struct.new(1,2,"3").to_hash
#=> {:a=>1, :b=>2, :c=>"3"}

end

########

Last modified:2006/06/23 20:09:23
Keyword(s):
References:[Phi_sym.rb] [SymHash.rb] [テンプレート]