エラーでなくワーニング (3)

class << h
  def [](k)
    begin
      self.fetch(k)
    rescue
      print "key not found\n"
    end
  end
end

Rubyリファレンスマニュアルより:

fetch(key[, default])
fetch(key) {|key| ... }
key に関連づけられた値を返します。該当するキーが登録されていない時には、引数 default が与えられていればその値を、ブロックが与えられていればそのブロックを評価した値を返します。そのいずれでもなければ例外 IndexError が発生します。 (ruby 1.9 feature: IndexError の代わりに IndexError のサブクラスの KeyError が発生します。)

すばらしい!Rubyは特異メソッドが当たり前のようにできる。Pythonは間違いを犯しにくいようにわざとビルトインクラスの属性をread-onlyにしているのだろうが、継承でのカスタマイズは可能だが、ビルトインクラスのインスタンスの特異メソッドができないし、ビルトイン以外でもnewモジュールを使用しないとできない。Pythonはクラスの機構はシンプルで好きなのだが、そういうところはいまいちかも。Pythonのクラスの機構はまだ分からないことが多いのでもう少し勉強すれば何か見えてくるかも。


ところで、jijixiさんが、__orig_getitem__ = dict.__getitem__でオリジナルの__getitem__を保存しておいているのはRubyのaliasを使う常套手段から来ているのではと思った。RubyPythonの非結合メソッドを利用するdict.__getitem__(self, key)みたいなことはできないのだろうか?Pythonにもsuperが存在するが、superにあたるモノを使用すればできそうな気もする…。やっぱりPythonとの比較のためにRubyを少し勉強すべきかな…。