Wednesday, June 18, 2008

Ruby メタプログラミング define method

同種のメソッドを実行時に生成する方法として、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: