- 论坛徽章:
- 0
|
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[0].send(content[1..-1])
- 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
复制代码 |
|