同種のメソッドを実行時に生成する方法として、define_methodで定義するやり方と文字列をevalするやり方がある。もちろん安全性からいってdefine_methodのほうがいい。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/usr/local/bin/ruby -wKU # encoding: utf-8 class Fetcher def fetch(n) puts "Fetching #{n ? n : "all"}." end [['ten',10],['one',1],['all',nil]].each do |name, n| define_method("fetch_#{name}") do fetch(n) end end [['two',2],['three',3],['four',4],['five',5]].each do |name, n| module_eval %{def fetch_#{name} fetch(#{n}) end} end end
f = Fetcher.new f.fetch_ten f.fetch_all f.fetch_five |
Output: 1 2 3 | Fetching 10. Fetching all. Fetching 5. | |
No comments:
Post a Comment