5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BasicObjectから例外を飛ばす

Posted at

別に例外に限った話じゃないですが。

RubyでプログラミングしてたらBasicObjectからクラスを定義したくなることってよくありますよね。
僕は今日初めてありました。


さて、Rubyの例外を送出するときは raise RuntimeError みたいなことをしてやればいいんですが、このraisePHPの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なんて使ったのかもさっぱり記憶にない…

5
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?