欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-24 10:35:28
单件方法 ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法 示例代码 str = “just a regular string”...

单件方法

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

示例代码

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

单件方法与类方法

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

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

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

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

类宏attr_accessor

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

示例代码

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

  • module#attr_reader 生成一个读方法
  • module#attr_writer 生成一个写方法
  • module#attr_accessor 同时生成读方法和写方法

示例代码

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

单件类

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

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

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

打开单件类

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

法一
 

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

法二

 
单件类的特性

  • 每个单件类只有一个实例(被称为单件类的原因),而且不能被继承
  • 单件类是一个对象的单件方法的存活所在
  • 引入单件类后的方法查找

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

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

打开单件类定义单件方法