ruby元编程——对象模型

引言:

    元编程可以用来完成以下工作:

    (1)编写一个Ruby程序来链接外部系统,使用元编程,可以编写一个包装器来接受任何方法调用,如果后来外部系统调价了方法,无需修改包装器,他会立刻自动支持这些新加入的方法

    (2)当遇到需要使用某种特定的语言来解决问题的时候,使用Ruby定义领域专属语言,可以不用自己定制解析器

 (3)大量降低重复代码,如一些方法名以及功能相识的方法,可以使用元编程方便的实现

 (4)需要去增强核心类时,使用ruby元编程可以轻松修改

对象模型

    class关键字,在类还未定义时,用于定义一个类,在类已存在时,用于打开一个类,或者说class关键字更像作用域操作符,将你带到类的上下文中。

    对象中包含了实例变量和方法:

    (1)实例变量:

    对象中包含了实例变量,可以通过Object#instance_variables()方法查看对象的实例变量;与Java不一样,Ruby中对象的类和它的实例变量没有关系,当给实例变量赋值时,它们就生成了

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

 

转载于:https://my.oschina.net/u/1413049/blog/396758

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值