HeadFirst Ruby 第七章总结 references
前言
这一章的内容关于 references,讲了当 Ruby 程序中可能会遇到关于 reference 与 object 之间概念混淆而导致的问题.
导言
本章从一个 astronomer 发现 star 并且为之命名的问题展开, astronomer 准备运用前一个 star 当作一个模版,赋值给以后的 star,问题出现为最后前面的 star 数据全部丢失.
本章后面也讲了为了达到 astronomer 的目标,关于 hash default object 和 hash default block 的相关应用.
代码:
class CelestialBody
attr_accesor :type, :name
end
altair = CelestialBody.new
altair.name = 'Altair'
altair.type = 'star'
polaris = altair
polaris.name = 'Polaris'
vega = polaris
vega.name = 'Vega'
puts altair.name, polaris.name, vega.name
Aliasing 这个问题
Heap、Reference 与 Object
定义:
Heap 是所有 Ruby object 存在的地方,是电脑的 memory 中的.
Ruby 通过 Reference 来 locate objects,当我们新建一个 new object 的时候, it returns a reference to itself.
例子:
代码: car = Car.new
Car.new 新建了一个 new object, 于是 returns a reference to the new car, 之后它将值赋给 car, 因此 reference 储存在 car 这个 variable 中了.
导言中问题的解决方案——hash defalut object 与 hash default block 之战
hash default object 的问题
问题起源:
`class CelestialBody
attr_accesor :type, :name
end
default_body = CelestialBody.new
default_body.type = 'planet'
bodies = Hash.new(default_body)
//出错的地方
bodies['Mars'].name= 'Mars'
bodies['Europa'].type = 'moon'
...
问题出现在标示以后的地方,如果输入: p bodies['Mars], bodies['Europa'], 可以看到它们的地址相同.
原因在于 bodies['Mars‘] 并没有新建一个新的对象,最终的效果是修改了 defalut object 这个 object 的属性.
解决的思路
将 Defalut Object 改为 Defalut Value,并且它的值为 CelestialBody.new, Ruby 能实现这个功能的方式叫做 Hash default block
什么是 hash default block
hash default block 是 block 的一种,当遇到如下情况时,执行 hash default block 中的语句.因此它既有 hash 的响应特征,又有 block 的特征
场合:
when a key is accessed for which no value has been assigned
格式:
bodies = Hashnew do |hash,key|
//option 的部分
body = CelestialBody.new
body.type = "planet"
//
hash[key] = body
body
需要注意的几点:
- 赋值语句不能省略:即上面的 hash[key] = body
- 最后的返回语句不能省略(可只写同等效的 expression )
上述第二点用到了 Ruby 中的一个 shortcut:
value of an assignment is the same as the value being assigned.
两个 Rules
- Rule #1 Don't modify the default object
- Assign values to the hash
总结:
If your default is a number, you can use a hash default object
If your default is anything else, you should use hash default block.
HeadFirst Ruby 第七章总结 references的更多相关文章
- HeadFIrst Ruby 第七章总结 hashes
前言 这一章节介绍了 Ruby 中 hash 这一数据类型的用法和特征. Hash 的定义 与 array 的对比 最大的不同: An array can only use integers as i ...
- HeadFIrst Ruby 第六章总结 block return values
前言 这一章通过抽取一个文件中的确定的单词的项目进行讲解,主要包括了: File 的打开.阅读与关闭 find_all & refuse方法的相关内容 map 方法的相关内容这章的核心是:关于 ...
- HeadFIrst Ruby 第二章总结 methods and classes
HeadFIrst Ruby 第二章总结 methods and classes 前言 这一章讲了如何创建自己的 class,并且讲了在用 class 创建 object 的两个要素: instanc ...
- <自动化测试方案_7>第七章、PC端UI自动化测试
第七章.PC端UI自动化测试 UI自动化测试又分为:Web自动化测试,App自动化测试.微信小程序.微信公众号UI层的自动化测试工具非常多,比较主流的是UFT(QTP),Robot Framework ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7 标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...
- Java语言程序设计(基础篇) 第七章 一维数组
第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...
随机推荐
- struts2 action中字符串转json对象出错 java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
commons-lang包有错,要么是引入错误,要么是没引入. 报不同错误,引入不同包. commons-beanutils-1.8.0.jar不加这个包 java.lang.NoClassDefFo ...
- 学习dart从这里开始
void main() { ; i < ; i++) { print('hello ${i + 1}'); } } // 定义个方法. printNumber(num aNumber) { pr ...
- 关于#ifdef #ifndef
https://www.cnblogs.com/agnily/p/5848768.html 1.先看#ifdef的用法: #define KEY1_PA0 #ifdef KEY1_PA0 ------ ...
- Dockerize a .NET Core application
Dockerize a .NET Core application Introduction This example demonstrates how to dockerize an ASP.NET ...
- PTA 7-2 列车调度(25 分)
7-2 列车调度(25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道 ...
- Git回顾
抄自廖雪峰的官方网站 完整图文请访问https://github.com/Mrlution/study/tree/master/git 关于repository 我认为repository是一个存放代 ...
- Lintcode35-Reverse Linked List-Easy
35. Reverse Linked List Reverse a linked list. Example Example1:For linked list 1->2->3, the r ...
- NOIP2018退役祭
退役感受 在写下这个标题的时候,我的心情是复杂的,无非就是感觉像对一位将要赶往战场的士兵说:"你的战争已经输掉了." 退役了,没有什么好说的.无论再怎么抱怨这题出的真烂也无法改变了 ...
- bean之间的属性是怎么维护的
spring对象[bean]之间的属性是通过什么维护的: 1.构造方法:标签:constructor-arg 2.set方法:标签:property <beans xmlns="htt ...
- 在ETH交易区块链里查看北大的那封信
本文仅限于科普编码知识使用,随便举的例子不代表本人立场. 欢迎在其他网站传播,但转载不得标注来源及作者. 1.随便打开一个ETH区块链浏览网站,比如:https://www.etherchain.or ...