metaprogramming-1-Dynamic Method
metaprogramming-1-Dynamic MethodRuby代码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 鼓励分享。 ganxie~分享。
页:
[1]