feiyang10086 发表于 2011-11-23 14:34

metaprogramming-1-Dynamic Method

metaprogramming-1-Dynamic Method





Ruby代码1.# cool dynamic method usage   
2.class MyClass   
3.    define_method :my_method do |my_arg|   
4.      my_arg * 8   
5.    end
6.end
7.
8.m = MyClass.new
9.p m.my_method 8   
10.p m.send(:my_method, 9)# a more complicated example   
11.puts "============== Example ==============="
12.# Dynamic Example   
13.# Dynamic Model   
14.class MOUSE   
15.    attr_accessor :price, :info, :c_id
16.    def initialize price, info, c_id   
17.      @price, @info, @c_id = price, info, c_id   
18.    end
19.end
20.class CPU   
21.    attr_accessor :price, :info, :c_id
22.    def initialize price, info, c_id   
23.      @price, @info, @c_id = price, info, c_id   
24.    end
25.end
26.class KEYBOARD   
27.    attr_reader :price, :info, :c_id
28.    def initialize price, info, c_id   
29.      @price, @info, @c_id = price, info, c_id   
30.    end
31.end
32.# Dynamic Method DS   
33.class DS   
34.    def initialize   
35.      @data = []   
36.    end
37.      
38.    def addCom *component   
39.      component.each{|c| @data << c }   
40.    end
41.      
42.    def count   
43.      @data.count   
44.    end
45.      
46.    class << DS   
47.      def define_get_method *component_name   
48.            component_name.each do |each|            
49.                %w-_info _price-.each do |content|   
50.                  define_method ("get_" + each.to_s + content).to_sym do |c_id|   
51.                        comArray = @data.select{|x| x.c_id == c_id}   
52.                        com = comArray.select{|x| x.is_a? eval(each.to_s.upcase)}   
53.                        com.send(content)   
54.                  end
55.                end
56.            end
57.      end
58.    end
59.    define_get_method :mouse, :keyboard, :cpu
60.end
61.#data prepare   
62.k1 = KEYBOARD.new 10, "keyboard_1", 1   
63.k2 = KEYBOARD.new 40, "keyboard_1", 2   
64.k3 = KEYBOARD.new 100, "keyboard_1", 3   
65.c1 = CPU.new 200, "cpu_1", 1   
66.m1 = MOUSE.new 1000, "apple Inc", 1   
67.
68.ds = DS.new
69.ds.addCom k1, k2, k3, c1, m1   
70.p ds.count   
71.p (ds.get_mouse_info 1), (ds.get_mouse_price 1)   
72.p ds.get_keyboard_info 1   
73.p ds.get_cpu_info 1   
74.# more about dynamic method   
75.class Computer   
76.    def initialize computer_id, data_source   
77.      @id = computer_id   
78.      @data_source = data_source   
79.      data_source.methods.grep(/^get_(.*)_info$/){Computer.define_component $1}   
80.    end
81.    def self.define_component name   
82.      define_method(name){   
83.            info = @data_source.send "get_#{name}_info", @id
84.            price = @data_source.send "get_#{name}_price", @id
85.            result = "#{name.capitalize}: #{info} $#{price}"
86.            return "**#{result}" if price > 500   
87.            result   
88.      }   
89.    end
90.end
91.puts "-----------------final invoke..-----------------"
92.c = Computer.new 1, ds   
93.p c.keyboard   
94.p c.mouse

zuerrong 发表于 2011-11-24 09:09

鼓励分享。

gr33n 发表于 2011-11-25 12:30

ganxie~分享。
页: [1]
查看完整版本: metaprogramming-1-Dynamic Method