美文网首页
术-机制:单例类的打开def obj.meth与class <<

术-机制:单例类的打开def obj.meth与class <<

作者: 稻草人_b788 | 来源:发表于2019-10-03 07:34 被阅读0次

    一、打开单例类的方法

    在ruby中打开单例类有两种方法:
    一种是def obj.meth的形式,另一种是class << obj; def meth的形式。

    二、两种打开单例类的方法的区别

    通常情况下,两种并没有什么区别。
    唯一一个不同点在于:常量解析的方式
    如果有一个顶层的常量N,同时也定义一个N在对象的单例类中:

    N = 1 #顶层的常量N
    obj = Object.new
    class << obj #打开obj对象的单例类
        N = 2 #obj对象的单例类中的常量N
        def show_N
          puts N
        end
    end
    
    def obj.show_N_another_way
        puts N
    end
    

    运行代码后,结果为:

    obj.show_N #结果为2
    
    obj.show_N_another_way  #结果为1
    

    这个区别在常量可见性对代码的影响上比较少见,在大多数的情况下,这两种单例方法定义的方式是可相互替换的。但是了解它们的不同是值得的,可用于解释一些出乎意料的结果。

    三、建议

    1.如果没有那么多方法要添加到单例类中,可以使用简短的def obj.meth形式来打开单例类并构建单例方法。
    2.如果有很多方法要加入到单例类,或者需要在单例类中加入模块,那么class << obj; def meth的形式更为灵活和美观。

    四、参考资料

    1.《Ruby程序员修炼之道(第2版)》[美] David A. Black--第13章1节(直接检查和修改单例类)

    相关文章

      网友评论

          本文标题:术-机制:单例类的打开def obj.meth与class <<

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