单件方法
Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法
示例代码
str = “just a regular string” def str.title"htmlcode">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的地方,这时就可以用到下面三个类宏:
- Module#attr_reader 生成一个读方法
- Module#attr_writer 生成一个写方法
- Module#attr_accessor 同时生成读方法和写方法
示例代码
class MyClass attr_accessor :my_attribue end
这样是不是就简洁多了呢"color: #ff0000">单件类
我们知道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
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]