大ヒット連ドラ、あまちゃんの「見つけてこわそう」をヒントにRubyでこれを表現してみました。
Kanazawa.rb meetup #13 用のスライドでしたが、出席できなかったので @Yukimitsu_Izawa さんに喋ってもらいました。なんと、出席した人が誰もネタ知らなかったw
⾒つけてこわそうSearch and Destroy ( or Seek and Destroy ) in Ruby@wtnabeKanazawa.rb meetup #132013-09-28 (Sat) at ITプラザ武蔵
View Slide
お品書き⾒つける壊す逆回転
今回壊すものRubyのオブジェクトRubyのメソッド
1. ⾒つける
RubyのClassRubyのClassは実は「Classオブジェクトのインスタンス」を「定数にバインドしている」だけ定数はObject.constantsで⾒つかるObject.constantsはSymbolのArrayなのでちょっと加⼯して判定する
こうObject.constants.sort.map {|e|Object.const_get(e.to_s)}.select {|e|e.class == Class}[ArgumentError, Array, BasicObject, Bignum, Binding, Class,Complex, ...
ポイントRubyはすべてオブジェクトクラスはClassオブジェクトのインスタンスオブジェクトのクラスは.classメソッドで分かるObjectやModuleに便利メソッドがあるよ
あれ?実際にはrequireしていないものは出⼒されない例外もClassだけど、例外は例外だけで⾒たいね
OK, 宿題にします
2. 壊す
Classを壊すrequire 'date'Date.today.to_s # => '2013-09-28'Date = nilDate.today # => NoMethodError: undefined metho
3. 逆回転
……
無理です><
直せるようにしておくrequire 'date'd = DateDate = nilDate.today # => NoMethodError: undefined methoDate = dDate.today.to_s # => '2013-09-28'
オブジェクトを壊すRubyのClassはオープンクラスカジュアルに再オープンして変更します
⾒つけるStringはみんな知ってるのでそれでとりあえず簡単なdowncaseメソッドで
壊すs = 'ABC's.downcase # => 'abc's.instance_eval {def downcase''end}s.downcase # => ''
これでは直せません><
メソッドの⾒つけ⽅Object.methods.sort.grep(/RE/).private_methods....instance_methods...
メソッド操作メソッドModule.private_methods.sort.grep(/method/)# => [:__method__, :alias_method,:define_method, :method_added,:method_missing, :method_removed,...]これらは通常 class 式の中で使います
壊すメソッドremove_methodundef_method
直せるようにしておくalias_method
壊すs = 'ABC's.downcase # => 'abc's.instance_eval {class << selfalias_method :downcase_org, :downcaseundef_method :downcaseend}s.downcase # => NoMethodError: undefined metho
逆回転s.instance_eval {class << selfalias_method :downcase, :downcase_orgundef_method :downcase_orgend}s.downcase # => 'abc'
ここでまた疑問
壊しまくったら?BlankSlate オブジェクト1.9以降のBasicObjectがこれに近い
既存のメソッドの動作にちょっとアレンジ単に消したいことってほとんどないそれ alias_method_chain で要 ActiveSupport
まとめRubyはオブジェクトとメソッドがカギクラスも特別なものではないRubyのクラスはオープンクラスメソッドを操作するメソッドがあるよ
⾒つけてこわそう
That's all folks !