ruby元编程——对象模型

引言:

    元编程能够用来完成如下工做:编程

    (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调用

相关文章
相关标签/搜索