別に例外に限った話じゃないですが。
RubyでプログラミングしてたらBasicObject
からクラスを定義したくなることってよくありますよね。
僕は今日初めてありました。
さて、Rubyの例外を送出するときは raise RuntimeError
みたいなことをしてやればいいんですが、このraise
はPHPのthrow
なんかと違って予約語でもなんでもなくて、Kernelモジュールで定義された、ただのメソッドです。
といふことはクラス定義の中でinclude Kernel
って書いてやれば万事解決しますね ヾ(〃><)ノ゙☆
include
したくないときは、::Kernel.raise
などと直接callしてやれば利用することができます。
class PoorClass < BasicObject
attr_accessor :val
def initialize (val)
@val = val
end
define_method :class do PoorClass; end
def is_a? (klass); self.class === klass; end
def to_s; val.to_s; end
def methods
%i(:new is_a? to_s methods respons_to? ==)
end
def respond_to? (method_name)
# ここでprintfデバッグ的なことがしたかった
# ::Kernel.raise method_name.inspect
methods.include? method_name
end
def == (other)
other.is_a?(self.class) && self.to_s == other.to_s
end
end
あとがき
本文中に「今日」とあるが、この記事は長いことQiitaの下書きに眠ってたので、いつ書いたのかまったく覚えてない。何の動機があってBasicObject
なんて使ったのかもさっぱり記憶にない…