読者です 読者をやめる 読者になる 読者になる

method_missing

 Hash使うときに結構な頻度で、h[:hoge]をh.hogeとタイプすることが多くなってきて困ってたので、それでも期待通りの動作をするようなものを書いて見ました。

class Hash < Object
  def method_missing(meth, *value)
    key = meth.to_s
    if key[-1,1] == '=' 
      self[key.chop.to_sym] = value[0]
    else
      self[meth]
    end 
  end 
end

h = {:foo => 'bar'}
h.hoge = 'fuga'
p h.hoge #=> 'fuga'
p h #=> {:foo=>"bar", :hoge=>"fuga"}

 存在しないメソッドを呼ぼうとしたときに呼ばれるmethod_missingを使って擬似的にメソッドが存在するようにするのがミソ。h.hogeを呼んだ場合はmethに「:hoge」とシンボルで入ってくるみたいですね。後は代入するときの「=」の挙動を分けてあげるだけ。


 ...ってのがプログラム言語Rubyに書いてありましたとさ。
 便利と言えば便利ですが、元々存在しているメソッド名をキーとして持つハッシュはこれだと呼べないので、使わない方がいいですね。