読者です 読者をやめる 読者になる 読者になる

valid,invalid

関心を持てる事柄について

『メタプログラミング Ruby 第2版』1章 頭文字A 読む

Ruby

1章はイントロダクションで、メタプログラミングのイメージを膨らませる。

Summary

  • とりあえずのメタプログラミングの定義はコードを記述するコード
  • Ruby では実行時に言語要素に質問することができる
  • これをイントロスペクションという
  • 実行時にクラスの情報を読み取れるこの性質を ActiveRecord は利用している
  • 特定の規約にもとづきモデルクラスとデータベースのテーブルをマッピングする
  • 一例が Movie => movies (このライブラリは英単語の単数形・複数形を変換する方法 #pluralize, #singularize を持つ)
  • おかげでデータベースのアトリビュートに基づきアクセサメソッドを動的に定義できる

Play

https://github.com/ohbarye/playground/blob/master/metaprogramming-ruby/chapter1_the_m_word/introspection.rb

ohbas-MacBook-Pro:chapter1_the_m_word ohbarye$ irb
irb(main):001:0> require './introspection.rb'
=> true
irb(main):002:0> my_object = Greeting.new 'Yo'
=> #<Greeting:0x007f98cb8402e0 @text="Yo">
irb(main):003:0> my_object.class
=> Greeting
irb(main):004:0> my_object.class.instance_methods false
=> [:welcome]
irb(main):005:0> my_object.instance_variables
=> [:@text]
irb(main):006:0>

Further

上記のメソッドはそれぞれ以下のクラスで定義されている。


Ruby 2.3.0 から本体に含まれるようになった did_you_mean gem も NoMethodError がスローされた箇所で呼び出せるメソッドや変数を動的に取得することで実現されている、という話を RubyKaigi で聞いた

いつもすごく助かっている。


頭文字Aはやはり『頭文字D』から来ている?