免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2436 | 回复: 2
打印 上一主题 下一主题

metaprogramming-1-Dynamic Method [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-23 14:34 |只看该作者 |倒序浏览
metaprogramming-1-Dynamic Method






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

论坛徽章:
0
2 [报告]
发表于 2011-11-24 09:09 |只看该作者
鼓励分享。

论坛徽章:
0
3 [报告]
发表于 2011-11-25 12:30 |只看该作者
ganxie~分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP