美文网首页
《Ruby 元编程》读书笔记三:方法

《Ruby 元编程》读书笔记三:方法

作者: 榆树下的小豆芽儿 | 来源:发表于2018-06-06 21:09 被阅读0次

动态方法

        目的:消除重复的代码。

①动态调用方法

        调用方法时,通常使用(·),也可以使用Object#send方法代替点标识符来调用MyClass#my_method方法。

        使用send方法仍然调用了my_method方法,但send方法的第一个参数是你要发送给对象的消息,也就是方法的名字。

        像这样,将调用的方法名作为参数,这样就可以在代码运行的最后一刻决定调用哪个方法,这个技巧称为动态派发。

        问题:send方法可以调用私有方法,这是破坏封装的行为,可以使用public_send方法代替。

②动态定义方法

        可以使用Module#define_method方法随时定义一个方法。define_method方法在MyClass内部执行,这种在运行时定义方法的技术成为动态方法。用Module#define_method方法代替def关键字定义方法的一个重要原因就是:define_method方法允许在运行时决定方法的名字。

        define_method方法是类方法,只有类才能调用,也是私有方法。它不能有显式调用,也就是不能有接受者,不能self.define_method这样调用,可以通过send(:define_method)强制调用。

method_missing方法

        method_missing是BasicObject的一个实例方法,而所有的对象都继承自BasicObject类, 当调用一个方法时,若在祖先链中未找到该方法,则会调用method_missing方法, BasicObject#method_missing()方法会抛出一个NoMethodError进行响应。

        覆写method_missing方法可以让你调用实际上并不存在的方法。

幽灵方法

        如果需要定义很多相似的方法时,可以通过method_missing()方法来方便开发,使用method_missing()方法处理消息,从调用者角度看与普通方法并无差别,但实际上接收者并没有相应的方法,只是统一进行了处理,这被称为幽灵方法。

        Hashie库中有一个神奇的类Hash::Mash。如果想添加一个新的属性,只要给这个属性赋值即可。

        Hash::Mash是Hash类的子类,并且它的属性是幽灵方法,源码如下:

动态代理

        一个捕获幽灵方法调用并把它们转发给另一个对象的对象,称为动态代理。

        注意:使用method_missing技术后,所有不存在方法的调用都会调用你覆盖的方法,这样会导致一些错误信息(你看不到NoSuchMethod这样的提示了),因此, 在使用method_missing方法的时候,一定要限定其使用范围,并且调用父类的super.method_missing方法,还原错误处理.

白板类

        当一个幽灵方法和真实方法发生冲突时, 而会执行真实的方法, 这个问题就是动态代理的通病, 为了安全起见, 应该在代理类中删除绝大多数继承来的方法, 这就是所谓的白板类. 

        - Module#undef_method()方法会删除所有的(包括继承的)方法 

        - Module#remove_method()方法只会删除接收者自己的(保留继承的)方法

相关文章

  • 《Ruby 元编程》读书笔记三:方法

    动态方法 目的:消除重复的代码。 ①动态调用方法 调用方法时,通常使用(·),也可以使用Object#se...

  • Ruby元编程(蛋人)

    01 Ruby元编程介绍和使用场景02 Ruby的类结构03 Singleton Method单例方法以及supe...

  • Ruby元编程笔记 - 方法

    Dynamic Method 通过send()去动态调用方法: 在Ruby2.2.2中,send()依然可以调用私...

  • Ruby元编程

    类 方法 代码块 类宏 Eval方法 实例变量、方法、类 实例变量(Instance Variables)是当你使...

  • ruby元编程

    对象模型 所有class定义之外的代码默认运行在顶级对象main中。 打开类 ruby的class更像是一个作用于...

  • Ruby元编程笔记——2.方法

    动态方法 动态调用方法Object#send动态定义方法Module#define_method method_m...

  • ruby元编程(1)

    面试中碰到一些面试官提到的关于ruby元编程的问题的总结 class和module的区别 官方说明class do...

  • Ruby元编程示例

  • ruby元编程(附录)

    拟态方法 拟态方法就是去掉括号调用方法的方式,会给ruby开发者带来很多语法糖,当然也会给开发者和ruby本身增加...

  • 2016-11-04 task-list

    今日任务 ruby on rails 第四章 ruby 元编程 今日总结 ruby 单引号与双引号字符串的重大区别...

网友评论

      本文标题:《Ruby 元编程》读书笔记三:方法

      本文链接:https://www.haomeiwen.com/subject/oreisftx.html