sleep rand(1.year) 年に一度は更新するであろうブログ

< メソッド

今gemを作っていて、その調査でActionDispatchのコードを見ていたらこんなコードを見つけました。

unless ActionController::Base < ActionController::Testing
  ActionController::Base.class_eval do
    include ActionController::Testing
  end
end

<メソッドの存在を知らなかったので「へぇー」という感じ。

irb(main):001:0> method(:<)
NameError: undefined method `<' for class `Object'
        from (irb):1:in `method'
        from (irb):1
        from /usr/local/opt/rbenv/versions/2.1.1/bin/irb:11:in `<main>'
irb(main):002:0> Array < Integer
=> nil
irb(main):003:0> Array < Enumerable
=> true
irb(main):004:0> Array.method(:<)
=> #<Method: Class(Module)#<>

Ruby 2.1.1のマニュアルを見てみると、こんな説明が。

Returns true if mod is a subclass of other. Returns nil if there’s no relationship between the two. (Think of the relationship in terms of the class definition: “class A<B” implies “A<B”)

クラス定義で継承を使うときと同じ<を演算子として使ってるよ、とのこと。これまでRubyでクラスの継承関係調べるコードを書く機会がなかったから、そういうメソッドがあるかどうかを調べることもなかったな。。