FrontPage  Index  Search  Changes  RSS  wikifarm  Login

Hash_tree.rb

概要

ハッシュを木形式で表示できる文字列に変換する。 ハッシュのリテラルとして使える形式の文字列にする。 要素に問題がなければ eval で Hash に戻る。

キーが適当な形でソートされる。


依存性

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

利用者

  1. SymHash.rb

実行見本:

ソースの後半の単独実行部分のコメントを参照してください。


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

(comment plugin is disabled).

説明


ソース:

Hash_tree.rb

#! ruby -Ks
#-- Hash_tree.rb

#
#  Hash#tree メソッドを追加する。
#
#  ハッシュを木形式で表示できる文字列に変換する。
#  ハッシュのリテラルとして使える形式の文字列にする。
#  要素に問題がなければ eval で Hash に戻る。
#
#  キーが適当な形でソートされる。
#
#  cf. Array_tree.rb
#

class Hash
  def tree(indent='',max_width=70)
    len = max_width - indent.size
    ret = "{\n"
    arr = self.sort{|l,r|
      l=l[0]
      r=r[0]
      (l.class != r.class) ? (l.class.to_s <=> r.class.to_s) : ((l.is_a? Numeric) ? (l <=> r) : (l.to_s <=> r.to_s))
    }
    arr.each{|k,v|
      ret += "#{indent}  #{k.inspect.ljust(12)} => "
      insp = v.inspect
      if defined?(v.tree) && insp.size >= len
        ret << v.tree(indent+"  ",max_width)
      else
        ret << insp
      end
      ret << " ,\n"
    }
    ret << indent+"}"
  end
end

if __FILE__ == $0

hash1 = { :ichi => 1 , "Array" => [1,2,3], "Hash" => {:a => 10 , :b => 20}}
hash2 = { :arr => hash1.to_a , :hash => hash1 }

puts hash2.tree # デフォルトでは 70桁で収まるハッシュは展開しない。

#=> {
#=>   :arr         => [[:ichi, 1], ["Hash", {:b=>20, :a=>10}], ["Array", [1, 2, 3]]] ,
#=>   :hash        => {:ichi=>1, "Hash"=>{:b=>20, :a=>10}, "Array"=>[1, 2, 3]} ,
#=> }

puts hash2.tree("",20) # require "Array_tree" していないので、配列は展開しない。

#=> {
#=>   :arr         => [[:ichi, 1], ["Hash", {:b=>20, :a=>10}], ["Array", [1, 2, 3]]] ,
#=>   :hash        => {
#=>     "Array"      => [1, 2, 3] ,
#=>     "Hash"       => {:b=>20, :a=>10} ,
#=>     :ichi        => 1 ,
#=>   } ,
#=> }

require "array_tree"

puts hash2.tree("",20) # require "Array_tree" すると、配列も展開する。

#=> {
#=>   :arr         => [
#=>     [ :ichi , 1 ,  ] ,
#=>     [
#=>       "Hash" ,
#=>       {
#=>         :a           => 10 ,
#=>         :b           => 20 ,
#=>       } ,
#=>     ] ,
#=>     [
#=>       "Array" ,
#=>       [
#=>         1 ,
#=>         2 ,
#=>         3 ,
#=>       ] ,
#=>     ] ,
#=>   ] ,
#=>   :hash        => {
#=>     "Array"      => [1, 2, 3] ,
#=>     "Hash"       => {:b=>20, :a=>10} ,
#=>     :ichi        => 1 ,
#=>   } ,
#=> }

end

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