Ruby基础教程(第5版)· 全书总复习
按四部分复盘第五版23章,以对象状态、控制分派、数据解释、资源边界四类故障模型和数据工具Capstone完成终局验收。
学习目标
- 能解释第1章 Ruby初探与第2章 便利的对象在“Ruby基础教程(第5版)· 全书总复习”中的责任边界
- 能围绕“怎样用一个可重建的数据工具证明 23 章知识已经形成系统?”运行正常与故障轨迹并定位首个分岔
- 能用“Ruby基础教程(第5版)· 全书总复习的输入样本、接收者与方法、关键状态前后值、正常与失败输出、异常或退出状态,以及复位后的再次运行记录。”证明“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”
来源、版次与运行边界
“Ruby基础教程(第5版)· 全书总复习”以作者维护的第 5 版支持页核定 2016 年 3 月 12 日首刷、两位作者、松本行弘监修以及四部分 23 章目录;逐章程序清单、练习答案和勘误只作为公开支持材料,不被冒充为原书全文。
对“Ruby基础教程(第5版)· 全书总复习”而言,中文解释、示例、交互、练习和答案均为独立教学重写;站内中文章名是与官方 23 章顺序对应的课程映射,不宣称是日文小节的逐字翻译,也不从公开程序清单复制整段实现。
“Ruby基础教程(第5版)· 全书总复习”固定在 Ruby 2.3 语境;Ruby 2.3.0 官方文档与稳定版发布说明用于核对当时可用的语言和标准库行为。现代 Ruby 的差异只能另列迁移说明,不能静默改变本页示例的版本结论。
围绕“怎样用一个可重建的数据工具证明 23 章知识已经形成系统?”,本页验收“Ruby基础教程(第5版)· 全书总复习的输入样本、接收者与方法、关键状态前后值、正常与失败输出、异常或退出状态,以及复位后的再次运行记录。”。先预测正常轨迹,再只注入“只核对最终查询结果,不保存对象状态、异常传播、编码和事务证据”;若无法定位第一处状态分岔,就拒绝当前解释。
为什么总复习从故障模型而不是目录背诵开始
完成23章后,最有价值的能力不是顺序背出Array后面是String,而是看到现象就知道画哪张图。三个数组元素一起变化属于对象状态;块里的return提前离开方法属于控制分派;UTF-8字符串与Windows-31J字节混用属于数据解释;导入中断留下半个数据库属于资源边界。官方目录保证覆盖,故障模型把覆盖转化为诊断方法。
先预测再分类:Hash.new([])导致不同key共享数组是哪类;rescue Exception吞掉终止信号是哪类;String#length与bytesize判断协议长度错误是哪类;File.open后回调抛错却没关闭handle是哪类;正则按逗号切CSV为何同时违反数据与边界契约。分类不是贴标签,而是决定收集什么证据、回查哪章、最小复现应保留哪些行为。
把23章从线性目录压缩成可执行的调试索引。
四部分终局复盘
第一部分:最小程序与对象消息
Ruby表达式几乎都围绕接收者发送消息。字面量创建对象,变量保存引用,方法返回最后一个表达式;数组、散列、正则和时间对象在第2章先提供直觉,第3章把它们放入实际命令。终局验收需要同时说明stdout/stderr、exit status、输入编码和运行目录,不能把IDE中的一次输出当作程序契约。
def run(argv, stdout: $stdout, stderr: $stderr)
path = argv.fetch(0)
stdout.puts File.basename(path)
0
rescue KeyError => error
stderr.puts "usage: ruby tool.rb PATH (#{error.message})"
64
end
exit(run(ARGV)) if $PROGRAM_NAME == __FILE__这里依次出现参数、方法、File类、依赖注入、特定异常与状态码。测试不要启动真实进程也可以传StringIO,但最终仍要做一次进程级验收,确认通道与exit status一致。
第二部分:作用域、分派、块与异常
第4-11章可以用一条调用链串联:局部变量引用一个receiver;条件决定是否调用;循环或迭代器重复调用;方法按参数契约执行;类与模块决定方法查找;运算符转成方法;块交给被调用者控制;异常沿栈传播并由rescue/ensure收口。
比“Ruby是动态语言”更具体。
class Batch
def initialize(items)
@items = items
end
def each_valid
return enum_for(__method__) unless block_given?
@items.each_with_index do |item, index|
yield item
rescue StandardError => error
warn "index=#{index} #{error.class}: #{error.message}"
end
end
end要验证空集合、块缺失、块异常、外部可变状态和重复枚举。rescue范围过大时会把哪个操作的错误归到当前item,也需要明确;清理资源应放在真正拥有资源的frame中。
第三部分:核心类的表示与语义
第12-21章围绕“同一个值如何被表示、转换和拥有”。Numeric有整数/浮点与范围;Array有顺序、索引、共享元素;String有字符、字节、编码和可变性;Hash有key equality、default与顺序;Regexp有pattern grammar、match state和回溯风险;IO/File/Dir有open/read/write/close;Encoding定义decode/encode错误;Time/Date定义日历、时区与区间;Proc把块对象化并带来参数与return差异。
是核心类复习的共同格式。
raw = File.binread("records.txt")
decoded = raw.encode("UTF-8", "Windows-31J", invalid: :raise, undef: :raise)
rows = decoded.each_line.filter_map.with_index(1) do |line, number|
fields = line.chomp.split("\t", -1)
raise "line #{number}: expected 3 fields" unless fields.length == 3
fields.freeze
end示例仅适用于真正的TSV,不适用于CSV;若源格式允许quoted newline,应换CSVparser。each_line是stream边界,encode是否一次加载全文件是memory边界,freeze只冻结外层数组还是字段字符串也要验证。正是这些问题把API调用升级为表示证明。
第四部分:工具的来源、事务与查询契约
第22章要求文本处理具有input grammar、encoding、streaming、deterministic output和error status;第23章把source provenance、CSV schema、normalization、SQLite schema/index、prepared insert、transaction、validation、atomic activation与parameterized query连接起来。数据库文件只是某个source version的派生索引,raw数据和构建报告才是重建依据。
阻止读者看到半完成状态。
database.transaction do
statement = database.prepare(<<~SQL)
INSERT INTO postal_codes(postal_code, prefecture, city, locality)
VALUES (?, ?, ?, ?)
SQL
begin
records.each { |record| statement.execute(*record.values_at(:code, :prefecture, :city, :locality)) }
ensure
statement.close
end
end还要固定gem/schema版本,验证duplicate distribution和index plan,在candidate关闭并flush后activate。查询参数绑定只能保护values,表名和排序字段必须allowlist;空结果是正常业务状态,数据库损坏才是系统错误。
四类故障模型
对象状态:Identity、Alias与Method Lookup
Ruby变量是标签,赋值不会自动复制对象。Array.new(3, [])和Hash.new([])都可能制造意外共享;dup与clone也只做浅复制且冻结/单例方法语义不同。对象故障先打印class、object_id、关键字段与ancestors,再缩小到哪次状态转移破坏不变量。
控制分派:Return、Yield与Exception
方法、块、Proc和lambda的参数/return不同;break、next、redo改变迭代;异常同时携带class、message、cause与backtrace。用于区分业务false、正常nil和执行失败。
数据解释:Bytes、Encoding、Pattern与Time
字符串的length按字符语义,bytesize按字节;force_encoding只改标签,不验证或转码;encode才做转换。正则处理模式,CSV处理结构;Time对象的offset与时区数据库不是一回事。每次转换都保存original,明确normalization version并测试不可表示字符。
资源边界:IO、Callback与Transaction
Block-form File.open、Dir.chdir、transaction和prepared statement都是owner工具。资源清理覆盖success、error、cancel和shutdown;ensure必须幂等且不能遮蔽原异常。Proc回调可能晚到,需用generation/token判断目标是否仍有效。SQLite candidate只有验证后才能activate,旧版本保留到rollback窗口结束。
Capstone:邮政编码文本与查询系统
终局项目覆盖至少三个部分,推荐完整重做第23章:命令行接收source/version;下载或读取immutable raw CSV;按声明encoding解码;用CSVparser逐row校验;保留original与canonical字段;在candidate SQLite中事务导入;运行integrity/count/sample query;原子activate;提供exact/prefix/name查询和稳定JSON输出。
防止demo只证明一次成功路径。
终局验收清单
- 能从空白写一个带ARGV、stdout/stderr、exit status和测试替身的命令。
- 能解释对象引用、变量作用域、类/模块查找、运算符方法化和块调用。
- 能画出异常传播与资源owner,证明success/error/cancel路径都收口。
- 能区分数值范围、Array/Hash alias、String bytes/encoding、Regexp grammar与Time offset。
- 能写流式文本管线,处理坏编码、格式错误、确定性排序和有界输出。
- 能实现CSV/SQLite candidate构建、事务导入、验证、原子激活、参数化查询和rollback。
- 能把任何失败归入四类模型,回指具体官方章节并构造最小复现。
正式节点与章专属证据
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第1章 Ruby初探必须连接输入、状态变化与可复核结果。 :第 1 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第2章 便利的对象必须连接输入、状态变化与可复核结果。 :第 2 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第3章 创建命令必须连接输入、状态变化与可复核结果。 :第 3 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第4章 对象、变量和常量必须连接输入、状态变化与可复核结果。 :第 4 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第5章 条件判断必须连接输入、状态变化与可复核结果。 :第 5 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第6章 循环必须连接输入、状态变化与可复核结果。 :第 6 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第7章 方法必须连接输入、状态变化与可复核结果。 :第 7 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第8章 类和模块必须连接输入、状态变化与可复核结果。 :第 8 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第9章 运算符必须连接输入、状态变化与可复核结果。 :第 9 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第10章 错误处理与异常必须连接输入、状态变化与可复核结果。 :第 10 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第11章 块必须连接输入、状态变化与可复核结果。 :第 11 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第12章 数值类必须连接输入、状态变化与可复核结果。 :第 12 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第13章 数组类必须连接输入、状态变化与可复核结果。 :第 13 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第14章 字符串类必须连接输入、状态变化与可复核结果。 :第 14 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第15章 散列类必须连接输入、状态变化与可复核结果。 :第 15 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第16章 正则表达式类必须连接输入、状态变化与可复核结果。 :第 16 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第17章 IO类必须连接输入、状态变化与可复核结果。 :第 17 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第18章 File类与Dir类必须连接输入、状态变化与可复核结果。 :第 18 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第19章 Encoding类必须连接输入、状态变化与可复核结果。 :第 19 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第20章 Time类与Date类必须连接输入、状态变化与可复核结果。 :第 20 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第21章 Proc类必须连接输入、状态变化与可复核结果。 :第 21 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第22章 文本处理必须连接输入、状态变化与可复核结果。 :第 22 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
- ↡在“Ruby基础教程(第5版)· 全书总复习”中,第23章 检索邮政编码必须连接输入、状态变化与可复核结果。 :第 23 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
对象与状态模型
从输入、接收者到可观察证据
怎样用一个可重建的数据工具证明 23 章知识已经形成系统?
输入与接收者
固定第1章 Ruby初探所需的原始值、Ruby 版本和调用入口。
状态变化
在执行前记录接收者身份,并声明第2章 便利的对象的允许状态。
观察证据
保存Ruby基础教程(第5版)· 全书总复习的初值、参数、编码或资源位置。
正式节点:第1章 Ruby初探、第2章 便利的对象、第3章 创建命令、第4章 对象、变量和常量、第5章 条件判断、第6章 循环、第7章 方法、第8章 类和模块、第9章 运算符、第10章 错误处理与异常、第11章 块、第12章 数值类、第13章 数组类、第14章 字符串类、第15章 散列类、第16章 正则表达式类、第17章 IO类、第18章 File类与Dir类、第19章 Encoding类、第20章 Time类与Date类、第21章 Proc类、第22章 文本处理、第23章 检索邮政编码
控制与消息轨迹
在相同初值下定位首个分岔
- 01固定第1章 Ruby初探的输入和接收者
- 02执行第2章 便利的对象并记录状态
- 03观察第3章 创建命令的返回或副作用
- 04用第23章 检索邮政编码核对不变量并复位
运行不变量:同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。
边界故障探针
一次只破坏一个前提
本章回顾:23章最终收敛为四种可证明能力
- 对象状态证明接收者、类型、identity、alias和状态转移。
- 控制分派证明caller、method/block、result、exception和下一owner。
- 数据解释证明range、shape、bytes、encoding、pattern、normalization和time语义。
- 资源边界证明handle、callback、transaction、candidate与所有终止路径归零。
- 四部分分别提供最小体验、语言基础、核心类与工具集成,任何一部分都不能被主题摘要替代。
- Capstone以正常、错误、中断、重复执行、回滚和shutdown矩阵完成全书验收。
练习与答案
练习
- 问题 1:建立正常轨迹。 回答“怎样用一个可重建的数据工具证明 23 章知识已经形成系统?”,并写出四步执行记录。
- 问题 2:注入单一故障。 只制造“只核对最终查询结果,不保存对象状态、异常传播、编码和事务证据”,应从哪里开始定位?
- 问题 3:覆盖正式节点。 用一个证据包串联第1章 Ruby初探、第2章 便利的对象、第3章 创建命令、第4章 对象、变量和常量、第5章 条件判断、第6章 循环、第7章 方法、第8章 类和模块、第9章 运算符、第10章 错误处理与异常、第11章 块、第12章 数值类、第13章 数组类、第14章 字符串类、第15章 散列类、第16章 正则表达式类、第17章 IO类、第18章 File类与Dir类、第19章 Encoding类、第20章 Time类与Date类、第21章 Proc类、第22章 文本处理、第23章 检索邮政编码,说明为什么结论可由另一位读者独立复核。
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 第1章 Ruby初探
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第2章 便利的对象
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第3章 创建命令
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第4章 对象、变量和常量
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第5章 条件判断
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第6章 循环
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第7章 方法
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第8章 类和模块
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第9章 运算符
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第10章 错误处理与异常
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第11章 块
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第12章 数值类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第13章 数组类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第14章 字符串类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第15章 散列类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第16章 正则表达式类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第17章 IO类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第18章 File类与Dir类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第19章 Encoding类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第20章 Time类与Date类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第21章 Proc类
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第22章 文本处理
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。
- 第23章 检索邮政编码
“Ruby基础教程(第5版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。