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#lengthbytesize判断协议长度错误是哪类;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([])都可能制造意外共享;dupclone也只做浅复制且冻结/单例方法语义不同。对象故障先打印classobject_id、关键字段与ancestors,再缩小到哪次状态转移破坏不变量。

控制分派:Return、Yield与Exception

方法、块、Proc和lambda的参数/return不同;breaknextredo改变迭代;异常同时携带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.openDir.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只证明一次成功路径。

终局验收清单

  1. 能从空白写一个带ARGV、stdout/stderr、exit status和测试替身的命令。
  2. 能解释对象引用、变量作用域、类/模块查找、运算符方法化和块调用。
  3. 能画出异常传播与资源owner,证明success/error/cancel路径都收口。
  4. 能区分数值范围、Array/Hash alias、String bytes/encoding、Regexp grammar与Time offset。
  5. 能写流式文本管线,处理坏编码、格式错误、确定性排序和有界输出。
  6. 能实现CSV/SQLite candidate构建、事务导入、验证、原子激活、参数化查询和rollback。
  7. 能把任何失败归入四类模型,回指具体官方章节并构造最小复现。

正式节点与章专属证据

  • :第 1 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 2 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 3 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 4 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 5 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 6 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 7 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 8 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 9 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 10 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 11 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 12 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 13 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 14 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 15 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 16 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 17 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 18 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 19 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 20 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 21 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 22 个正式节点要能回到“同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。”,并说明故障发生前后的第一处差异。
  • :第 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章 检索邮政编码

控制与消息轨迹

在相同初值下定位首个分岔

  1. 01固定第1章 Ruby初探的输入和接收者
  2. 02执行第2章 便利的对象并记录状态
  3. 03观察第3章 创建命令的返回或副作用
  4. 04用第23章 检索邮政编码核对不变量并复位

运行不变量:同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。

边界故障探针

一次只破坏一个前提

基线满足:同一输入、Ruby 版本和构建参数产生相同状态、结果、诊断与回滚行为。

本章回顾:23章最终收敛为四种可证明能力

  1. 对象状态证明接收者、类型、identity、alias和状态转移。
  2. 控制分派证明caller、method/block、result、exception和下一owner。
  3. 数据解释证明range、shape、bytes、encoding、pattern、normalization和time语义。
  4. 资源边界证明handle、callback、transaction、candidate与所有终止路径归零。
  5. 四部分分别提供最小体验、语言基础、核心类与工具集成,任何一部分都不能被主题摘要替代。
  6. Capstone以正常、错误、中断、重复执行、回滚和shutdown矩阵完成全书验收。

练习与答案

练习

  1. 问题 1:建立正常轨迹。 回答“怎样用一个可重建的数据工具证明 23 章知识已经形成系统?”,并写出四步执行记录。
  1. 问题 2:注入单一故障。 只制造“只核对最终查询结果,不保存对象状态、异常传播、编码和事务证据”,应从哪里开始定位?
  1. 问题 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版)· 全书总复习”中的正式节点;必须说明它接收什么、改变什么,以及用什么结果复核。

资料与写作方式声明

本章以Ruby 基础教程第 5 版作者支持资料合法公开试读核定可见范围,并以目录限定未公开部分,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…