クラス名の直後にクラスメソッドを呼び出す
本日の知見。
うーん、そこにextend書くのか…… https://t.co/298XtYmzfJ
— Pocke(ぽっけ) SW-1309-2807-5790 (@p_ck_) 2017年11月18日
module Asd extend self def some_method p 'something' end end
今までこういうコードは見たことがなかったんですが、上記のコードのようにモジュール名(クラス名)の直後に extend
を呼び出すことが出来るみたい。
で、いろいろと試してみた。
module M def homu p "homu" end end class Super end # クラスでも出来る class X extend M end # 他のクラスメソッドも呼び出せる class X include M end # そもそもメソッドじゃなくてもいい class X def homu p :homu end end # 継承している場合はエラー # `Integer': can't convert Class into Integer (TypeError) class X2 < Integer include M end
と、いうような感じで継承をしていなければクラス名の直後に直接構文を続けてかけるぽい。
まあ実際は件のコードみたいに extend
とか呼び出したりする事が実用的そう。
個人的には以下のようなワンライナーであれば ;
が必要ないので割と知見。
# ; は必要がない class X include M end # 以下のように ; が必要だと思ってた… # class X; include M; end
まあでもよくよく考えると
module M1 module M2 end end
みたいにネストした module
の定義を1行にまとめることコードを書くことが多いのでこれの延長戦だと思えば…。