元编程能够用来完成如下工做:编程
(1)编写一个Ruby程序来连接外部系统,使用元编程,能够编写一个包装器来接受任何方法调用,若是后来外部系统调价了方法,无需修改包装器,他会马上自动支持这些新加入的方法ui
(2)当遇到须要使用某种特定的语言来解决问题的时候,使用Ruby定义领域专属语言,能够不用本身定制解析器spa
(3)大量下降重复代码,如一些方法名以及功能相识的方法,可使用元编程方便的实现code
(4)须要去加强核心类时,使用ruby元编程能够轻松修改对象
class关键字,在类还未定义时,用于定义一个类,在类已存在时,用于打开一个类,或者说class关键字更像做用域操做符,将你带到类的上下文中。资源
对象中包含了实例变量和方法:作用域
(1)实例变量:class
对象中包含了实例变量,能够经过Object#instance_variables()方法查看对象的实例变量;与Java不同,Ruby中对象的类和它的实例变量没有关系,当给实例变量赋值时,它们就生成了require
(2)方法:变量
经过调用Object#methods()方法,能够得到一个对象的方法列表,实例方法实际上是放在类对象中
常量:任何一大写字母开头的引用(包括类名和模块名),都是常量。
类与模块对比:模块基本上就是一组实例方法,而类时一个增长了若干功能(superclass()方法和new()方法)的模块, module用来作命名空间,或者在某处被include,extend;(superclass()方法和new()方法是Class的实例方法)
Module类提供了两个constants()方法,其中一个是实例方法,另外一个是类方法,Module#constants()(实例方法)返回当前范围的常量,而Module.constants()(类方法)返回程序中全部顶级常量,包括类名,例:
module M Y = 'another constant' class C X = 'constant' Module.nesting # => [M::C, M] end end M.constants # => [:Y, :C] Module.constants[0..1] # => [:Object, :Module]
使用Module.nesting()方法能够得到当前代码调用出上级的命名空间
load与require的区别:
(1)load引入同一个文件时会重复加载,require只引入一次
(2)load有第二参数load('motd.rb', true),强制引入常量只在自身范围内有效,经过这种方式加载文件,Ruby会建立一个匿名的模块,使用它做为命名空间来容纳引入文件的全部常量,加载完成后,该模块会被销毁(默认false)
load、require、include、extend 区别:
(1)load,require用来加载资源;include,extend用来导入module(文件中必须是module定义,否则抛异常)
(2)load第二个参数不为true时与require效果类似,但运用场景不一样,load用来执行某段外部文件中的代码,require用来导入类库
(3)include将module中的方法做为调用处的实例方法,extend将module中的方法做为调用出的类方法
当调用一个方法的时候,Ruby须要作两件事情:首先,找到这个方法;而后,执行这个方法
(1)找到方法
在使用对象的类的ancestors()方法能够查看祖先链,一个对象的祖先链按照向右一步再向上规则,若是类中引用了模块,模块的位置在该类以后,若引入了多个模块,最后一个引入的模块在最前面
(2)执行方法
只要调用某个对象的方法时,那个对象就成为self,不过在类和模块定义中而且在任何方法定制以外self的角色有这个类或模块担当
private关键字表示下面的方法只能用隐含接受者--self调用