Day05 -寻找自己:Ruby的self物件与singleton method
前情提要:
在第四天里,我们用参赛者的例子解说实体方法与类别方法。
类别中的实体物件,想要玩弄方法时,可以有三种取用方式:(跟斯斯有三种一样)
该类别所定义的实体方法。
模块中可取得的实体方法。(关于模块,记得第三天的include与extend比较吗?)
类别方法:类别物件的singleton method
Class can use methods from three areas:
Instances of class can call methods that are defined as instance methods in their class.
Instances of Class have access to the instance methods defined in Module
Or instances can call a singleton method of a class object.出处
所以我们在今天要解说一下self与singleton method啰!
Ruby经典面试题目#05
self是什么意思?What does self mean?
self有丰富层次的含义。就跟我们的内心一样(??来点播一首陈绮贞的Self??)它虽然代表自己本身的物件Object,但还记得,我们在第一天说到,Ruby的世界几乎都是物件吗?
因此,self有两种意思:
Self在类别class里,代表目前的类别(leafor)。
Self在实体instance里,代表目前的实体。
简单解释:实体就是物体在內存的位置,就好像每个宝宝(实体)生下来,都是从某个妈妈的子宫(內存)里出来的。我们必须经历过实体化的过程才能成为一个活生生的人呢!
幸好,产生一个实体不用等“怀胎十月”这么久,只要像我们在第一天一样使用@宣告內存位置就可以产生实体变数了:
class LoveSong
def initialize
@message =“I was born to love you!”#定义实体变数(instance variable)@message
end
def sing_a_song
puts @message
end
end
Ting = LoveSong.new
Ting.sing_a_song
#=> I was born to love you!
用LoveSong类别另写一段代码实作self:
class LoveSong
def
self.song1()
“We are the champions!”
end
class << self
def song2()
“We will rock you!”
end
end
p self # => LoveSong
p self.class # => Class
p self.singleton_methods # [:song1,:song2]
p self.song1()#=>“We are the champions!”
p self.song2()#=>“We will rock you”
end
在这里的self代表目前的类别名称LoveSong,我们查询self.class还是类别class,而这里的self.singleton_method出现了:song1与:song2这两个能够分别印出两首歌的类别方法(class method)。
我们在第一天文章曾经提到利用superclass查找父类别的方法,查到类别的父类别,是物件。class.superclass是object。
但其实:每一个类别class上面都还有一层隐形的类别class(隐形的翅膀),我们可以称作metaclass超类别。
在Ruby,类别class上面的隐形类别,我们叫它eigenclass特征类别。出处]。
Singleton Method
单例方法=单例类别的实体方法。
(指的是某物件实体「的单例类别」的实体方法,而不仅是某个物件的实体方法,中间多夹了一层隐形的翅膀「单例类别」)
singleton methods of an object are not instance methods of the class of the object;
they are instance methods of the singleton class of the object.
当我们讲到Singleton Method,就会提到Singleton Pattern单例模式,这个在面向对象语言(如:Java)共同的观念。
如果我们能保证某一个类别只产生一个物件实体,而且提供存取该物件的统一方法。这种设计模式就称为单例模式。
我们可以直接存取,而不需要实体化此类别的物件。
使用Singleton Method的时机
当我们想控制实体数目,节省系统资源的时候。
再度把例子搬出来:一间教室里只有一台打印机,所有电脑都可以联机打印机,但打印机一次只能印出一台电脑上的文件。
还记得我们在第四天举的例子是查找铁人参赛者名单吗?在这个例子中,一次只能查找一名参赛数据。
class IronmanList
def self.find(id)
p“finding Ironman ID: #{id}”
end
end
IronmanList.find(1)
使用规则:
此类别只能有一个物件实体。(IronmanList类别中,只有一个self)
此类别必须自己建立自己的唯一实体:def self.find(id)
此类别必须给其他物件提供这个实体。
使用场景:
此物件是类别中唯一的物件。如同IronmanList的序列号唯一。(跟身份证号码一样)
当创建此物件需要消耗较的资源过多时,可节省系统资源。(例如:连接数据库、连接打印机)
当我们为实体定义了自已的singleton method,代表了这个方法只属于该实体,尽管是相同的class的实体也无法使用别人的singleton method。(每个实体的单例类别是不同的。)
总结
近一步说明类别方法、实体方法,与单例方法的关系。中文翻译的话,我们可以这样记:
类别的eigenclass(特征类别)方法=类别方法(xcsjbj)。
实体的eigenclass(特征类别)方法=单例方法=单例类别的实体方法。
实体方法
实体已在类别里定义好了。
如果你需要将实体方法,运用在某个特定的实体,就记得要在类别里定义好这个实体。
举例:“每个人(物件实体)都能赢得”的方法
类别方法
类别方法并不在类别里定义,而是在类别里的物件实体的一种单例方法。
如果此方法并不会和某个特定的实体变数绑在一起,就使用类别方法!
举例:“查找名单”的方法
学程序的好处就是会查找许多原文数据(间接提升英文阅读功力!)
进一步发现许多原则上的定义用英文表达会更为清楚。
所以,我们第四天(实体方法与类别方法)与第五天的总结(单例方法的进一步说明),从这段英文就能看得更加清楚之间的关系了:)
Instance methods are methods of a class(defined in the class's definition)
Class methods are singleton methods on the Class instance of a class(not defined in the class's definition).They are defined on the singleton class of the object.More Information
编按:这篇算是我目前为止写过最有挑战性的IT文章,因为牵涉到metaprogramming的定义,从一开始自己一头雾水的情况,努力查找许多原文数据,也从自己撰写代码举例之后,总算获得一点头绪。(还记得第一版写完的时候,自己也看不懂在写什么XD,多读几遍+反复润饰之后才渐渐领悟开窍。)写文章或技术笔记的好处就是要真的懂了才写得出来。若新手小妹我翻译或理解上有错误,还请板上资深网友多多指教!:)
Day05 -寻找自己:Ruby的self物件与singleton method的更多相关文章
- Day06 - Ruby三种存取限制:Public,Protected,Private
前情提要: 在第五天的最后,我们提到了一句话“相同的class的实体也无法使用别人的singleton method”. 在今天,我们把焦点放在Ruby的method,继续了解存取限制:) Ruby经 ...
- Day04 -玩弄Ruby的方法:instance method与class method
前情提要在第三天时,我们解说了如何在class里用include与extend,去使用module的method. Include is for adding methods to an instan ...
- 【转】Ruby on Rails中select使用方法
在Ruby on Rails中真的有一堆Select helper可以用,我们经常容易混淆.常见的有三个..select, select_tag, collection_select(其余的什么sel ...
- ruby 疑难点之—— yield 和 yield self
yield 所有的"方法(methods)"隐式跟上一个"块(block)"参数. 块参数也可以明确给定,形式就是在参数前面加一个"&&quo ...
- ruby Methods, Procs, Lambdas, and Closures
define simple method定义简单方法 关键字def用于方法定义,在其后是方法名和可选的参数名列表,参数名列表会用一对圆括号括住.构成方法主体的代码放在参数列表之后,end用于结束方法定 ...
- ruby面向对象class
ruby对象是严格封装的:只能通过定义的方法访问其内部状态.方法使用的成员变量在对象外部不能直接访问,不过可以通过getter.setter等访问器方法(accessor),使他们看起来好像是直接访问 ...
- [置顶] ruby复制对象的方法(dup 和 clone)
Ruby内置的方法Object#clone和Object#dup可以用来copy一个对象,两者区别是dup只复制对象的内容,而clone还复制与对象相关联的内容,如singleton method [ ...
- HeadFIrst Ruby 第二章总结 methods and classes
HeadFIrst Ruby 第二章总结 methods and classes 前言 这一章讲了如何创建自己的 class,并且讲了在用 class 创建 object 的两个要素: instanc ...
- Ruby学习笔记1 -- 基本语法和数据类型, Class
Ruby 有4种数据类型:String, Boolen, Array, Hashes Ruby 有3种操作方法:Method, attribute, ?? Ruby 有xxx: Classes, Ob ...
随机推荐
- Deviceiocontrol操作异常时,关于getlasterror的错误代码解析
[0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句柄无效. [7]-存储控制块被损坏 ...
- Oracle数据库容量使用情况调查
-- 剩余容量 select sum(bytes) FREE from DBA_FREE_SPACE where tablespace_name ='xxx'; -- 总容量 select sum(b ...
- YARN简述
YARN(Yet Another Resource Negotiator)是Hadoop的集群资源管理系统.YARN提供请求和使用集群资源的API,但这些API很少直接用于用户代码.相反,用户代码中用 ...
- OpenResty的现状、趋势、使用及学习方法
Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案. 通过 OpenRest ...
- [UE4]计算箭头方向:正切、SetRelativeRotation、RotationFromXVector、Get MotionController Thumbstick X
正切 正弦函数 sinθ=y/r 余弦函数 cosθ=x/r 正切函数 tanθ=y/x 余切函数 cotθ=x/y 正割函数 secθ=r/x 余割函数 cscθ=r/y 已知y和x,求角度θ: ...
- 3、谈谈 Java NIO
在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New,原因在于它相对于之前的 IO 类库是新增的.此外,旧的 IO 类库提供的 ...
- IO多路复用(Python)
1. select: 监听多个文件描述符(当文件描述符条件不满足时,select会阻塞),当某个文件描述符状态改变后,将该文件描述符添加到对应返回的列表 调用: fd_r_list, fd_w_lis ...
- C# 生成二维码扫码
转载 https://www.cnblogs.com/jys509/p/4592539.html 引用ThoughtWorks.QRCode.dll (源代码里有) 1.简单二维码生成及解码代码: / ...
- 使用Git Bash从Git上下载代码到本地以及上传代码到码云Git
前提是在码云上已经新建一个空的项目,可参考:https://www.cnblogs.com/babysbreath/p/9170455.html 1.新建一个目录,存放下载下来的项目,我在D盘新建了一 ...
- RAND函数和SRAND函数
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...