Ruby中,特定于某一对象的方法被称为Singleton method。

例如:

a = "string"def a.runputs "#{self} run"
endstr.run # =>#string run

run方法是特定于a这个对象的,故run方法是a的Singleton方法。

实现上,当定义Singleton方法时,Ruby会在对象a和String类之间插入一个匿名类,或者说Singleton类。此时,a的类为Singleton类,Singleton类的超类为String类。

我们考虑到String类其实也可以看为Class类的一个实例,所以Singleton方法也可以在类的层面上定义。

例如:

class Adef self.runputs "#{self} run"end
endA.run # => A run

只需要把A看做Class类的一个实例,而Singleton类插入到了A和Class类之间。

有人会发现,上面这段代码不是定义了一个类方法嘛?

yes, you got it !实际上,在Ruby中,没有所谓的“类方法”,所有的类方法都是通过Singleton类来实现的。

上面的代码也可以写为:

class Adef A.runputs "#{self} run"end
end

同过这个Singleton类的存在,我们可以做很多有趣的操作:

str =  "string"class << strdef runputs "#{self} run"end
end

这种方式定义的结果与开头代码的结果是一致的。

我们可以利用这个Singleton类进行简单的元编程:

class A
enda = A.newclass << aattr_accessor :attr
enda.attr = 10
puts a.attr

在Singleton类中利用attr_accessor设定attr实例变量,这样我们相当于再程序运行时动态的改变了原有类,获得了更大的灵活性。

Ruby的Singleton method相关推荐

  1. 《Programming Ruby 中文版第二版》P577页singleton_method_undefined方法说明有点问题

    "当一个singleton方法在这个接受者中没有定义(??)时,singleton_method_undefined作为回调函数会被调用" 这是书上P577页的说法,看看官网的原文 ...

  2. ruby中的复制 dup clone

    Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method [ ...

  3. ruby复制对象的方法(dup 和 clone)

    Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method [ ...

  4. 12 种方式轻松实现 Ruby 调用

    作者 | Gregory Witek 译者 | 弯月,责编 | 王晓曼 头图 | CSDN 下载自东方IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 最近,与同事聊天的时候,我们谈到 ...

  5. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  6. ruby 怎么抛异常_Ruby中的异常处理

    ruby 怎么抛异常 Ruby异常处理 (Ruby Exception Handling) Exceptions are abnormal conditions arising in the code ...

  7. ruby中、.reject_Ruby中带有示例的Array.reject方法

    ruby中..reject Ruby Array.reject方法 (Ruby Array.reject Method) In the last article, we have seen how w ...

  8. Ruby中带有示例的Hash.key?(value)方法

    Hash.key?(value)方法 (Hash.key?(value) Method) In this article, we will study about Hash.key?(value) M ...

  9. as_hash ruby_Hash.merge(other_hash)方法与Ruby中的示例

    as_hash ruby Hash.merge(other_hash)方法 (Hash.merge(other_hash) Method) In this article, we will study ...

最新文章

  1. 多线程断点下载开发总结(二)- 多线程写文件
  2. Android中SQLite的使用
  3. 台湾国立大学郭彦甫Matlab教程笔记(14)polynomial differentiation多项式微分
  4. HDR视频生态圈追踪
  5. 华为人工智能计算机平台,华为发布首个人工智能移动计算平台
  6. 数据结构--图的广度优先搜索
  7. 前端学习(3027):vue+element今日头条管理-关于图标的处理
  8. Python3bytes、hex、字符串之间相互转换
  9. List中对象model的排序问题
  10. int long long 的范围
  11. mysql排序区分大小写吗_MySQL的order by时区分大小写
  12. 计算机在剪辑方面的应用,多媒体技术对影视后期制作的应用
  13. matlab灰色图像和彩色图像的均值、标准差和熵
  14. 软件设计模式期末大作业——可乐商城管理系统
  15. python安装pandas太慢_pytorch 安装缓慢 或者报错问题 pandas 安装
  16. python利用matplotlib库绘制三维图学习
  17. 怎么添改计算机程序,注册表怎么样添改注册表, – 手机爱问
  18. 【影评】:卧虎藏龙中的人物性格的分析
  19. 第六场问题 B: Bumped!(Dijkstra + 优先队列优化)
  20. canvas轨迹运动, 利用向量实现点匀速运动

热门文章

  1. HDU - 3183 A Magic Lamp 线段树
  2. zoj-3228 Searching the String AC自动机
  3. 深度学习(3)基础3 -- 前向传播与反向传播
  4. vscode 配置 Latex 编译后自动清理多余文件(.log .out等文件)
  5. VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
  6. ROS Melodic安装、配置和使用turtlebot2(集成众多源代码直接下载)
  7. 在CentOS 6.6 64bit上基于源码安装全功能的vim 7.4实录
  8. UE5蓝图初学课程 Unreal Engine 5: Blueprints for Beginners
  9. 性能定位常用命令整理
  10. 看雪CTF 2016_第八题分析