次のコード行で何をし$1.to_sym => args[0]
、何をしますか?($1.to_sym,*args,&block)
class Table
def method_missing(id,*args,&block)
return as($1.to_sym,*args,&block) if id.to_s =~ /^to_(.*)/
return rows_with($1.to_sym => args[0]) if id.to_s =~ /^rows_with_(.*)/
super
end
# ...
end
コンテキスト:
RuportはRubyレポートライブラリです。Ruport :: Data :: Tableクラスを使用して、表形式のデータを作成し、それをさまざまな形式(テキストなど)に変換できます。
require 'ruport'
table = Ruport::Data::Table.new :column_names => ["country" , "wine" ], :data => [["France" , "Bordeaux" ], ["Italy" , "Chianti" ], ["France" , "Chablis" ]]
puts table.to_text
⇒
+--------------------+
| country | wine |
+--------------------+
| France | Bordeaux |
| Italy | Chianti |
| France | Chablis |
+--------------------+
フランスワインのみを選択し、それらをコンマ区切りの値に変換するとします。
found = table.rows_with_country("France" )
found.each do |row|
puts row.to_csv
end
⇒
France, Bordeaux
France, Chablis
今行ったことは、Ruport :: Data :: Tableでrows_with_country()という名前のメソッドを呼び出すことです。しかし、このクラスの作成者は、countryという名前の列が作成されることをどのようにして知ることができますか?実は、作者はそれを知りませんでした。Ruportの内部を見ると、rows_with_country()とto_csv()の両方がゴーストメソッドであることがわかります。Ruport :: Data::Tableクラスは上記で定義されたとおりです。
rows_with_country()の呼び出しは、より伝統的な方法であるrows_with(:country)の呼び出しになります。このメソッドは、列名を引数として取ります。また、to_csv()の呼び出しはas(:csv)の呼び出しになります。メソッド名がこれらの2つのプレフィックスのいずれでも始まらない場合、RuportはKernel#method_missing()にフォールバックし、NoMethodErrorをスローします。(それがスーパーキーワードの目的です。)