前にもチラと書いたけど、RubyでJSONをいじっている。
JSONの処理系はいくつかあるようだけど、私はsimple-json.rbを使っている。
これが良いライブラリなのかどうなのかはわからないけど、とりあえずちゃんと動いているので満足している。
それはいいんだけど、こいつはJSONをハッシュに変換する。データがアクセス出来れば結局は何でもいいのだけど、深い階層を持ったデータだとアクセスがなかなか面倒臭い。Rubyで構造付きのものを扱うのはハッシュにするのが定石らしいのだけど、階層が深くなると面倒になる。
hash['a']['b']['c']
みたいになるのは、キー入力が厄介。プログラム中でアクセスするのは別にどうってことないのだけど、即値があると面倒。みんなはどうしてるか知らないけど、面倒臭いなーと思っていた。
そこで、これを、
hash.a.b.c
のようにアクセスする方法を考えた。
class Hash def method_missing(sym,arg=nil) name = sym.to_s if ( name[-1] == ?= ) self[name[0..-2]] = arg elsif ( self[name] ) return self[name] else printf("method missing [%s]\n",name) end end end
というのを入れておいてやると、上記のように出来る。エラーチェックみたいなのは、うっとおしいと思ったらなくしてもいい。これだとタイプ数も少ない。アレイの時には普通に[0]みたいに書くから、
hash.a.b.c.d[2]
みたいな書き方も当然出来る。
探してみたんだけど、こんな方法をやっているのは見掛けなかった。それは一々書く程のこともないことなのか、あるいはRubyな人達はこういった記法を使う必要性を感じてないんだろうか…
PS.
上のコード。とりあえず動くけど、場合によってはいろいろチェックしたり注意しなきゃいけないことがあるから、鵜呑みにしちゃダメよ。あくまでも「原理」ってだけ。
PS2.
当然ながら、メンバとメソッドが衝突すると悲惨なことになるので、そういったことはないという制約の下で。
個人的にはRubyの構造体は萎えです。何がいけないってことはないのだけど、人気があまりなさそう(=APIとしてあまり使われてない)ので、あまり使い道がない。なんでだろうね。