• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解Ruby中的单件方法和单件类

    单件方法

    Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法

    示例代码

    str = “just a regular string”
    
    def str.title?
      self.upcase == self
    end
    
    str.title? # => false
    str.methods.grep(/title?/) # => [:title?]
    str.singleton_methods  #=> [:title?]
    
    str.class # => String
    String.title? #=> NoMethodError
    
    

    另外,除了上面使用的定义方法,还可以通过Object#define_singleton_method方法来定义单件方法

    单件方法与类方法

    前面的笔记中有说道在Ruby中类也是对象,而类名只是常量,所以,在类上调用方法其实跟在对象上调用方法一样:

    类方法的实质是: 它是一个类的单件方法,实际上,如果比较单件方法的定义和类方法的定义,会发现其实二者是一样的
     

    def obj.a_singleton_method; end
    def MyClass.another_class_method; end
    

    二者均使用了def关键词做定义

    def object.method
      #方法主体
    end
    

    上面的object可以是*对象的引用、常量类名或者self。

    类宏attr_accessor

    Ruby对象没有属性,如果希望得到一些像属性的东西,需要分别定义一个读方法和写方法(也就是java、objc中的set和get方法),最直接的可以这样:

    示例代码

    class MyClass
      def my_attribute=(value)
        @my_attribute =value  
      end
      def my_attribute
        @my_attribute
      end
    end
    
    obj = MyClass.new
    obj.my_attribute = ‘x'
    obj.my_attribute  #=> ‘x'
    
    

    但是上面这种写法,如果属性众多的话就会存在Repeat Yourself的地方,这时就可以用到下面三个类宏:

    示例代码

    class MyClass
      attr_accessor :my_attribue
    end
    

    这样是不是就简洁多了呢? 当然,使用方法(读与写)跟上面的实现是一致的。

    单件类

    我们知道Ruby中对象的方法的查找顺序是: 先向右,再向上,其含义就是先向右找到对象的类,先在类的实例方法中尝试查找,如果没有找到,再继续顺着祖先链找。

    前面一篇中有介绍过单件方法,单件方法是指那些只针对某个对象有效的方法,那么如果为一个对象定义了单件方法,那么这个单件方法的查找顺序又应该是怎样的?

    class MyClass
      def my_method; end
    end
    
    obj = MyClass.new
    
    def obj.my_singleton_method; end
    
    

    首先,单件方法不会在obj中,因为obj不是一个类,其次它也不在MyClass中,那样的话所有的MyClass都应该能共享调用这个方法,也就构不成单件类了。同理,单件方法也不能在祖先链的某个位置(类似superclass: Object)中。正确的位置是在单件类中,这个类其实就是我们在irb中向对象询问它的类时(obj.class)得到的那个类,不同的是这类与普通的类还是有稍稍不同的。也可以称其为元类或本征类。

    打开单件类

    Ruby提供了两种方法获取单件类的引用,一种是通过传统的关键词class配合特殊的语法

    法一
     

    class  an_object
      # 自己的代码
    end
    
    obj = Object.new
    singleton_class = class  obj
      self
    end
    singleton_class.class # => Class
    
    

    另一个方法是,通过Object#singleton_class方法来获得单件类的引用:

    法二

    “abc”.singleton_class  # => #Class: #String:0xxxxxx>>
    

     
    单件类的特性

    基于上面对单件类的基本认识,引入单件类后,Ruby的方法查找方式就不应该是先从其类(普通类)开始,而是应该先从对象的单件类中开始查找,如果在单件类中没有找到想要的方法,它才会开始沿着类(普通类)开始,再到祖先链上去找。这样从单件类之后开始,一切又回到了我们在没有引入单件类时候的次序。

    通过下面这个代码可以自行验证一下

    class C
      def a_method
        ‘C#a_method()'
      end
    end
    
    class D  C; end
    
    obj = D.new
    
    

    打开单件类定义单件方法

    class  obj
      def a_singleton_method
        ‘obj#a_singleton_method()'
      end
    end
    
    obj.singleton_class.superclass #=> D
    

    您可能感兴趣的文章:
    • Ruby面向对象编程中类与方法的基础学习
    • Ruby中的Proc类及Proc的类方法Proc.new的使用解析
    • Ruby类实例变量、类实例方法和类变量、类方法的区别
    • Ruby面向对象编程中类的方法与类的扩展
    上一篇:Ruby环境下安装使用bundler来管理多版本的gem
    下一篇:Ruby面向对象编程中类的方法与类的扩展
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    详解Ruby中的单件方法和单件类 详解,Ruby,中的,单件,方法,