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 ...
随机推荐
- Java Swing 界面中文乱码问题解决(Idea环境)
编译(build)的时候和运行的时候使用同样的字符集就可以了.这里,我都设置为“UTF-8”.具体做当如下: File->Settings->Build...->Compiler,在 ...
- Linux运维宝典:最常用的150个命令汇总
一.线上查询及帮助命令(2个) 二.文件和目录操作命令(18个) 三.查看文件及内容处理命令(21个) 四.文件压缩及解压缩命令(4个) 五.信息显示命令(11个) 六.搜索文件命令(4个) 七.用户 ...
- 后台文本编辑器KindEditor介绍
后台文本编辑器KindEditor介绍 我们在自己的个人主页添加文章内容的时候,需要对文章内容进行修饰,此时就需要文本编辑器助阵了! 功能预览 KindEditor文本编辑器 KindEditor文本 ...
- vue 路由别名 路由跳转
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- VS2015创建类库项目后添加不了WPF资源字典,窗口,用户控件处理办法
打开项目工程文件在PropertyGroup标签最后加上下面3行: <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FA ...
- Koa,React和socket.io
安装 socket.io/socket.io-client 基本用法 首先koa和socket.io代码片段 const server = require('http'). const server ...
- 逆向工程vgenerator(三)
前言 该项目的最后一篇博文,最终构建,写入文件,整体项目流程将在本片文章中写出. jdbcType /** *@author vvxtoys *mysql单位 -> jdbcType */ pa ...
- Tensorflow数学运算
一.Tensor 之间的运算规则 1) 相同大小 Tensor 之间的任何算术运算都会将运算应用到元素级 2) 不同大小 Tensor(要求dimension 0 必须相同) 之间的运算叫做广播(br ...
- 软件职位进阶--立Flag
PS:是我从看过的书籍<软件测试进阶之路>上摘录的 很喜欢:深耕细作一词,可以走管理leader方向,但我更愿意是技术掌握到手后,兼职管理岗位. 庆幸吧,脚踏实地,没有上来就学自动化,所以 ...
- SecureCR 控制台输出行数设置
1.Options –>Session Options–>Terminal–>Emulation 2.在Scrollback输入你需要的最大显示行数,最大行数是128000,修改完全 ...