image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... | トップページ | ピックアップ:ブラウザからセカンドライフにアクセス, iPhoneは、IP Infusion吉川さんがブログを始めてしまうくらいすごいらしい, etc... »

2007-07-11

xfy/xvcd の言語リソース編集ツールが欲しい (その3.5)

昨日の xfy/xvcd の言語リソース編集ツールが欲しい (その3) では、
Hash が追加順序を保持していないので、ちょっと不自然なコードで回避していた。
web でしらべたら OrederdHash という Hash で順番を保持させる例が見つかった。
明日はこれを使って xfy/xvcd のリソースファイル変換の ruby スクリプトを書き直そう。
今日はとりあえず, OrderdHash のコードだけを示す。

$ cat orderdhash.rb
# See - http://rubyist.g.hatena.ne.jp/onishi/comment?date=20060519
#     - http://blog.kks-online.net/archives/2006/06/ruby_1.html

require 'pp'

require 'test/unit'

class OrderedHashTest < Test::Unit::TestCase
  def test_ordered_hash
    oh = OrderedHash.new
    doTest(oh)
  end

  def test_ordered_hashX
    oh = OrderedHashX.new
    doTest(oh)
  end

  def doTest(oh)
    oh["one"] = 1
    oh["two"] = 2
    oh["three"] = 3
    oh["two"] = 4

    assert_equal oh.keys, ["one", "two", "three"]
    assert_equal oh.values, [1, 4, 3]

    ks = []
    vs = []
    oh.each {|k, v|
      ks << k
      vs << v
    }
    assert_equal ks, oh.keys
    assert_equal vs, oh.values

  end
end

class OrderedHash < Hash
  def initialize
    @keyodrer = []
    super
  end

  def keys
    @keyodrer
  end

  def values
    # @keyodrer.collect{|k| self[k]}
    self.values_at(*@keyodrer)
  end

  def []=(_key, _value)
    @keyodrer << _key unless @keyodrer.include?(_key)
    super(_key, _value)
  end

  def delete(_key)
    @keyodrer.delete(_key)
    super(_key)
  end

  def each
    @keyodrer.each{|k|
      yield(k, self[k])
    }
  end
end

class OrderedHashX
  def initialize()
    @keys = []
    @content = {}
  end

  def [](key)
    @content[key]
  end

  def []=(key, value)
    @keys << key unless @keys.include?(key)
    @content[key] = value
  end

  def delete(key)
    @keys.delete(key)
    @content.delete(key)
  end

  def keys()
   @keys
  end

  def values
    @content.values_at(*@keys)
  end

  def each()
    @keys.each{|key|
      yield(key, @content[key])
    }
  end

end

今回は each メソッドの定義の仕方を学ぶことができた。
( pp での動作を定義するにはどうしたらいいんだろう...)

« ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... | トップページ | ピックアップ:ブラウザからセカンドライフにアクセス, iPhoneは、IP Infusion吉川さんがブログを始めてしまうくらいすごいらしい, etc... »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/15728648

この記事へのトラックバック一覧です: xfy/xvcd の言語リソース編集ツールが欲しい (その3.5):

« ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... | トップページ | ピックアップ:ブラウザからセカンドライフにアクセス, iPhoneは、IP Infusion吉川さんがブログを始めてしまうくらいすごいらしい, etc... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク