免费注册 查看新帖 |

Chinaunix

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

简单了解Metaprogramming in Ruby [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-03 11:49 |只看该作者 |倒序浏览
简单了解Metaprogramming in Ruby








Metaprogramming是ruby的一个特性,可以动态的修改语言结构,比如类结构,模块结构和实例变量信息等等。

甚至可以在运行时往程序中加入并运行新的代码而不需要重启你的程序。
  1. 1. 本篇中先简单了解attr_accessor, attr_reader和attr_writer的用法
  2. ?123456789101112131415161718 class Person     #可带多个参数,用来自动生成参数的getter和setter方法   attr_accessor :name, :age    #只生成参数的getter方法   attr_reader :height    #只生成参数的setter方法   attr_writer :height  end  p = Person.newp.name = "hanks"p.age = 20p.height = 180puts p.name
复制代码
2. 内部实现原理是什么样的?
在Ruby中,动态代码的实现是通过一系列的”eval”方法实现的,常用的有eval, instance_eval, class_eval, module_eval

四种,在这里我们将使用class_eval(往class中加入可执行代码)。代码如下:

?12345678910111213141516171819202122232425262728293031323334353637383940 #往Class类中加入代码,Class类是所有类的基类,也就是这一操作 #会影响到所有的类,这里只是举例,要慎用! class Class      # *号表示参数个数可以是一个包含1个或者是任意多个元素的数组   def my_attr_accessor(*args)       #iterator循环,也就是对每一个参数做一些什么样的操作
  1. args.each do |arg|         # getter的写法, %Q表示eval中的表达式可以多行       self.class_eval %Q{           # #{x}动态根据参数名构造函数名         def #{arg}           # @#{x}表示动态根据参数名构造私有变量           return @#{arg}         end        }         #setter的写法,一行的写法       self.class_eval("def #{arg}=(val);@#{arg}=val;end")       end    end    end  #用法如下 class Person   my_attr_accessor :name, :ageend  p = Person.newp.name = "hanks"p.age = 20puts p.name puts p.age
复制代码
目前有关四种eval的用法的区别还不是太了解,继续学习啊~~

论坛徽章:
0
2 [报告]
发表于 2012-03-03 11:49 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP