$1.to_sym => args[0]
和($1.to_sym,*args,&block)
在以下代碼行中做了什麼?ruby中的動態方法定義
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 ::數據表::類來創建表格數據,並將其轉換爲不同的格式文本,例如:
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()是Ghost方法。 Ruport :: Data :: Table類有點像上面定義的那樣。
對rows_with_country()的調用變爲調用更傳統的 方法rows_with(:country),它將列名稱作爲參數-define- 。另外,對to_csv()的調用變成對as(:csv)的調用。如果方法 名稱不以這兩個前綴中的任何一個開頭,則Ruport將返回 以引發NoMethodError的Kernel#method_missing()。 (這就是 super關鍵字是。)
簡短回答:它將第一個匹配組並將其轉換爲符號,在本例中爲「rows_with_」或「to_」尾隨值,並將其作爲方法參數傳遞,或將其用作散列鍵第一個參數爲method_missing。 – 2012-07-10 13:05:33