メタプログラミングRuby 1章メモ
https://scrapbox.io/files/6599eda8173c1e00254bf9dc.png
メタプログラミング
コードを書くコードを書くこと
→言語要素を実行時に操作するコードを書くこと
イントロスペクション
プログラムの実行時にオブジェクトの性質や型を調べること
code: ruby
class Greeting
def inithialize(text)
@text = text
end
def welcome
@text
end
end
myobj = Greeting.new("Hello")
myobj.class # Greeting
myobj.instance_methods(false) # :welcome
myobj.instance_variables # :@text
# idea: プログラムの実行時にインスタンスメソッドを増やすなど「書き込み」はできるのだろうか?
code: ruby
class Entity
attr_reader :table, :ident
def initialize(table, ident)
@table = table
@ident = ident
Database.sql "INSERT INTO #{@table} (id) VALUES (#{@ident})" end
def set(col, val)
end
def get(col)
end
end
DBのテーブルをクラスに、オブジェクトをレコードにマッピング
このクラスを継承して何かを作った際に、例えばtitleの書き込み読み込みメソッドを作ると
DBのテーブルにもtitleカラムがあって、クラスにもtitleアトリビュートがある状態になる
ActiveRecord
イントロスペクションによって、クラス名とテーブルのマッピングをしてくれる
アクセサメソッドを実行中に定義しているらしい
すごい
title= みたいなもの
オブジェクトのインスタンス変数名をシンボルの配列として返します。
アノテーション
とは、プログラミング言語において、変数や関数、メソッドなどの要素に型情報を付与すること
---
C言語では、コンパイル時と実行時のコードは別だから、実行時に何か操作を増やすなどのメタプログラミングはサポートされていない。Rubyは気軽にメタプログラミング可能。