Ruby的Singleton method
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相关推荐
- 《Programming Ruby 中文版第二版》P577页singleton_method_undefined方法说明有点问题
"当一个singleton方法在这个接受者中没有定义(??)时,singleton_method_undefined作为回调函数会被调用" 这是书上P577页的说法,看看官网的原文 ...
- ruby中的复制 dup clone
Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method [ ...
- ruby复制对象的方法(dup 和 clone)
Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method [ ...
- 12 种方式轻松实现 Ruby 调用
作者 | Gregory Witek 译者 | 弯月,责编 | 王晓曼 头图 | CSDN 下载自东方IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 最近,与同事聊天的时候,我们谈到 ...
- Ruby中的设计模式——《松本行弘的程序世界》
< 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...
- ruby 怎么抛异常_Ruby中的异常处理
ruby 怎么抛异常 Ruby异常处理 (Ruby Exception Handling) Exceptions are abnormal conditions arising in the code ...
- ruby中、.reject_Ruby中带有示例的Array.reject方法
ruby中..reject Ruby Array.reject方法 (Ruby Array.reject Method) In the last article, we have seen how w ...
- Ruby中带有示例的Hash.key?(value)方法
Hash.key?(value)方法 (Hash.key?(value) Method) In this article, we will study about Hash.key?(value) M ...
- 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 ...
最新文章
- 多线程断点下载开发总结(二)- 多线程写文件
- Android中SQLite的使用
- 台湾国立大学郭彦甫Matlab教程笔记(14)polynomial differentiation多项式微分
- HDR视频生态圈追踪
- 华为人工智能计算机平台,华为发布首个人工智能移动计算平台
- 数据结构--图的广度优先搜索
- 前端学习(3027):vue+element今日头条管理-关于图标的处理
- Python3bytes、hex、字符串之间相互转换
- List中对象model的排序问题
- int long long 的范围
- mysql排序区分大小写吗_MySQL的order by时区分大小写
- 计算机在剪辑方面的应用,多媒体技术对影视后期制作的应用
- matlab灰色图像和彩色图像的均值、标准差和熵
- 软件设计模式期末大作业——可乐商城管理系统
- python安装pandas太慢_pytorch 安装缓慢 或者报错问题 pandas 安装
- python利用matplotlib库绘制三维图学习
- 怎么添改计算机程序,注册表怎么样添改注册表, – 手机爱问
- 【影评】:卧虎藏龙中的人物性格的分析
- 第六场问题 B: Bumped!(Dijkstra + 优先队列优化)
- canvas轨迹运动, 利用向量实现点匀速运动
热门文章
- HDU - 3183 A Magic Lamp 线段树
- zoj-3228 Searching the String AC自动机
- 深度学习(3)基础3 -- 前向传播与反向传播
- vscode 配置 Latex 编译后自动清理多余文件(.log .out等文件)
- VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
- ROS Melodic安装、配置和使用turtlebot2(集成众多源代码直接下载)
- 在CentOS 6.6 64bit上基于源码安装全功能的vim 7.4实录
- UE5蓝图初学课程 Unreal Engine 5: Blueprints for Beginners
- 性能定位常用命令整理
- 看雪CTF 2016_第八题分析