前言

这一章的内容关于 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

需要注意的几点:

  1. 赋值语句不能省略:即上面的 hash[key] = body
  2. 最后的返回语句不能省略(可只写同等效的 expression )

上述第二点用到了 Ruby 中的一个 shortcut:
value of an assignment is the same as the value being assigned.

两个 Rules

  1. Rule #1 Don't modify the default object
  2. 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的更多相关文章

  1. HeadFIrst Ruby 第七章总结 hashes

    前言 这一章节介绍了 Ruby 中 hash 这一数据类型的用法和特征. Hash 的定义 与 array 的对比 最大的不同: An array can only use integers as i ...

  2. HeadFIrst Ruby 第六章总结 block return values

    前言 这一章通过抽取一个文件中的确定的单词的项目进行讲解,主要包括了: File 的打开.阅读与关闭 find_all & refuse方法的相关内容 map 方法的相关内容这章的核心是:关于 ...

  3. HeadFIrst Ruby 第二章总结 methods and classes

    HeadFIrst Ruby 第二章总结 methods and classes 前言 这一章讲了如何创建自己的 class,并且讲了在用 class 创建 object 的两个要素: instanc ...

  4. <自动化测试方案_7>第七章、PC端UI自动化测试

    第七章.PC端UI自动化测试 UI自动化测试又分为:Web自动化测试,App自动化测试.微信小程序.微信公众号UI层的自动化测试工具非常多,比较主流的是UFT(QTP),Robot Framework ...

  5. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  6. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7  标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...

  9. Java语言程序设计(基础篇) 第七章 一维数组

    第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...

随机推荐

  1. struts2 action中字符串转json对象出错 java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException

    commons-lang包有错,要么是引入错误,要么是没引入. 报不同错误,引入不同包. commons-beanutils-1.8.0.jar不加这个包 java.lang.NoClassDefFo ...

  2. 学习dart从这里开始

    void main() { ; i < ; i++) { print('hello ${i + 1}'); } } // 定义个方法. printNumber(num aNumber) { pr ...

  3. 关于#ifdef #ifndef

    https://www.cnblogs.com/agnily/p/5848768.html 1.先看#ifdef的用法: #define KEY1_PA0 #ifdef KEY1_PA0 ------ ...

  4. Dockerize a .NET Core application

    Dockerize a .NET Core application Introduction This example demonstrates how to dockerize an ASP.NET ...

  5. PTA 7-2 列车调度(25 分)

    7-2 列车调度(25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道 ...

  6. Git回顾

    抄自廖雪峰的官方网站 完整图文请访问https://github.com/Mrlution/study/tree/master/git 关于repository 我认为repository是一个存放代 ...

  7. Lintcode35-Reverse Linked List-Easy

    35. Reverse Linked List Reverse a linked list. Example Example1:For linked list 1->2->3, the r ...

  8. NOIP2018退役祭

    退役感受 在写下这个标题的时候,我的心情是复杂的,无非就是感觉像对一位将要赶往战场的士兵说:"你的战争已经输掉了." 退役了,没有什么好说的.无论再怎么抱怨这题出的真烂也无法改变了 ...

  9. bean之间的属性是怎么维护的

    spring对象[bean]之间的属性是通过什么维护的: 1.构造方法:标签:constructor-arg 2.set方法:标签:property <beans xmlns="htt ...

  10. 在ETH交易区块链里查看北大的那封信

    本文仅限于科普编码知识使用,随便举的例子不代表本人立场. 欢迎在其他网站传播,但转载不得标注来源及作者. 1.随便打开一个ETH区块链浏览网站,比如:https://www.etherchain.or ...