本次学习资料
通读《Ruby元编程》,记录下有趣的以及不明白的知识点
元编程
元编程是能编写能写代码的代码。
编写在运行时操作自身的代码,称为动态元编程,代码生成器和编译器的那种方式称为静态元编程。Ruby不需要编译,因此非常适合元编程。
内省机制
inspection,意思为检查,反省的意思,所以顾名思义,就是可以检测自己属于什么类,自己有没有某个方法,自己的父类是谁。
◆:一个ruby对象o 的内省
1:得到自己的object id: o.object_id
2:检测自己的类型 inspect type: [].class == Array
3:检测自己的类:inspect class: o.class == Foo o.instance_of?(Foo)
4:检测类的继承:inspect class hierarchy: o.class.superclass o.class.included_modules
5:检测自己是否拥有某个方法: o.respond_to?(“reverse”)
6:检测自己有哪些实例方法(false表示只要类自己的方法,不要继承的):o.class.instance_methods(false)
7:检测自己有哪些实例变量:o.class.instance_variables
tips:Active Record通过内省机制查看类的名字,根据类名自动的映射到对应的表(类名:驼峰命名法,表名:小写,以“_”分割),然后读取表中字段,自动定义同名的属性和相应的访问器。
打开类、猴子补丁、细化(了解)
Ruby的class关键字更像是一个作用域操作符,而不是类型声明语句。class关键字的核心任务是把你带到类的上下文中,让你可以在里面定义方法。
在Ruby中,定义一个未存在的类可以定义这个类,若定义一个存在的类,就不再定义,会打开这个类,进行这次定义中的操作。比如,可以定义String类来增加新的方法。
class String
def to_asd
"asd"
end
end
a = "qwe"
puts a.to_asd
#=>asd
但若是String本身就有to_asd方法,则会覆盖掉原本的to_asd方法,导致Bug。因此这种鲁莽的修改类的方式叫做猴子补丁。
为了解决猴子补丁问题,需要用到细化refine,细化和打开类的区别在于细化不是全局性的,细化就像在原来的类上加了一块补丁,而且它会覆盖正常的方法查找,此外,细化只在程序的部分区域生效,从using语句的位置开始到模块或文件结束。
module StringExtensions
refine String do
def reverse
"esrever"
end