时间:2021-05-22
单件方法
Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法
示例代码
str = “just a regular string”def str.title? self.upcase == selfendstr.title? # => falsestr.methods.grep(/title?/) # => [:title?]str.singleton_methods #=> [:title?]str.class # => StringString.title? #=> NoMethodError另外,除了上面使用的定义方法,还可以通过Object#define_singleton_method方法来定义单件方法
单件方法与类方法
前面的笔记中有说道在Ruby中类也是对象,而类名只是常量,所以,在类上调用方法其实跟在对象上调用方法一样:
类方法的实质是: 它是一个类的单件方法,实际上,如果比较单件方法的定义和类方法的定义,会发现其实二者是一样的
二者均使用了def关键词做定义
def object.method #方法主体end上面的object可以是*对象的引用、常量类名或者self。
类宏attr_accessor
Ruby对象没有属性,如果希望得到一些像属性的东西,需要分别定义一个读方法和写方法(也就是java、objc中的set和get方法),最直接的可以这样:
示例代码
但是上面这种写法,如果属性众多的话就会存在Repeat Yourself的地方,这时就可以用到下面三个类宏:
示例代码
class MyClass attr_accessor :my_attribueend这样是不是就简洁多了呢? 当然,使用方法(读与写)跟上面的实现是一致的。
单件类
我们知道Ruby中对象的方法的查找顺序是: 先向右,再向上,其含义就是先向右找到对象的类,先在类的实例方法中尝试查找,如果没有找到,再继续顺着祖先链找。
前面一篇中有介绍过单件方法,单件方法是指那些只针对某个对象有效的方法,那么如果为一个对象定义了单件方法,那么这个单件方法的查找顺序又应该是怎样的?
class MyClass def my_method; endendobj = MyClass.newdef obj.my_singleton_method; end首先,单件方法不会在obj中,因为obj不是一个类,其次它也不在MyClass中,那样的话所有的MyClass都应该能共享调用这个方法,也就构不成单件类了。同理,单件方法也不能在祖先链的某个位置(类似superclass: Object)中。正确的位置是在单件类中,这个类其实就是我们在irb中向对象询问它的类时(obj.class)得到的那个类,不同的是这类与普通的类还是有稍稍不同的。也可以称其为元类或本征类。
打开单件类
Ruby提供了两种方法获取单件类的引用,一种是通过传统的关键词class配合特殊的语法
法一
另一个方法是,通过Object#singleton_class方法来获得单件类的引用:
法二
单件类的特性
基于上面对单件类的基本认识,引入单件类后,Ruby的方法查找方式就不应该是先从其类(普通类)开始,而是应该先从对象的单件类中开始查找,如果在单件类中没有找到想要的方法,它才会开始沿着类(普通类)开始,再到祖先链上去找。这样从单件类之后开始,一切又回到了我们在没有引入单件类时候的次序。
通过下面这个代码可以自行验证一下
class C def a_method ‘C#a_method()' endendclass D < C; endobj = D.new打开单件类定义单件方法
class << obj def a_singleton_method ‘obj#a_singleton_method()' endendobj.singleton_class.superclass #=> D声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
类方法类方法其实质是生活在该类的单件类中的单件方法。其定义方法有三种,分别是:#法一defMyClass.a_class_method;end#法二classM
C++单例模式的详解及实例1.什么叫单例模式?单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全
亲,供应商在供销平台发布产品,分为2种方式:单件发布和批量导入两种方式哦。一、单件发布1、进入供销平台,选择【产品管理】-【单件发布新产品】,在2016年4月1
本文实例讲述了C#实现单件模式的三种常用方法。分享给大家供大家参考。具体分析如下:单件模式是一种设计模式,即保持同时只能创建一个实例,下面列出了C#实现单件模式
在Ruby中,执行shell命令是一件不奇怪的事情,Ruby提供了大概6种方法供开发者进行实现。这些方法都很简单,本文将具体介绍一下如何在Ruby脚本中进行调用