Ruby 入门指南 / 第 01 章:Ruby 概述
第 01 章:Ruby 概述
“我希望 Ruby 能帮助每一位程序员在编程中感受到快乐。” —— 松本行弘
1.1 Ruby 的诞生
1.1.1 创造者:松本行弘
Ruby 由日本程序员松本行弘(Yukihiro Matsumoto,社区昵称 Matz)于 1995 年创建。Matz 的初衷很简单——他想要一门既强大又让人心情愉悦的脚本语言。
| 时间 |
事件 |
| 1993 年 2 月 24 日 |
Matz 开始设计 Ruby |
| 1995 年 12 月 |
Ruby 0.95 首次公开发布 |
| 1996 年 |
Ruby 1.0 正式发布 |
| 1998 年 |
Ruby 在日本迅速流行 |
| 2000 年 |
《Programming Ruby》出版,Ruby 开始走向世界 |
| 2004 年 |
Ruby on Rails 发布,引爆全球 Ruby 热潮 |
| 2013 年 |
Ruby 2.0 发布,引入关键字参数等特性 |
| 2020 年 |
Ruby 3.0 发布,引入 Ractor 并发模型 |
| 2024 年 |
Ruby 3.3 发布,YJIT 性能持续提升 |
1.1.2 命名趣事
Ruby 的名字并非来自宝石,而是参考了 Perl(珍珠)的命名传统——Matz 选择了诞生于六月的宝石(Ruby),寓意比 Perl 更珍贵。
1.2 设计哲学
1.2.1 Matz 的核心原则
Ruby 的设计深受 Perl、Smalltalk、Eiffel、Ada 和 Lisp 的影响,核心理念包括:
| 原则 |
说明 |
体现 |
| 多范式 |
支持面向对象、函数式、命令式 |
一切皆对象,也支持函数式风格 |
| 最少惊讶 (Principle of Least Surprise) |
语言行为符合直觉 |
方法命名清晰、API 一致性高 |
| 快乐编程 |
降低程序员的认知负担 |
优雅的语法糖、丰富的迭代器 |
| 约定优于配置 |
提供合理的默认值 |
约定的命名规范、目录结构 |
| 灵活性 |
允许程序员以自己的方式编码 |
开放类、元编程、猴子补丁 |
1.2.2 “一切都是对象”
这是 Ruby 最核心的设计理念。在 Ruby 中,数字、字符串、布尔值、nil,甚至类本身都是对象。
# 在大多数语言中,数字是基本类型
# 在 Ruby 中,数字也是对象
42.class # => Integer
42.even? # => true
42.times { |i| puts i } # 输出 0 到 41
# 字符串是对象
"hello".upcase # => "HELLO"
"hello".length # => 5
# nil 也是对象
nil.class # => NilClass
nil.nil? # => true
nil.to_s # => ""
# 布尔值也是对象
true.class # => TrueClass
false.class # => FalseClass
# 类本身也是对象
String.class # => Class
Class.class # => Class
1.2.3 “最少惊讶"原则
# Ruby 尽量让代码的行为符合你的直觉
# 例:字符串是可变的(不像 Python 的字符串不可变)
s = "hello"
s << " world" # 原地修改
puts s # => "hello world"
# 例:数组下标越界不会报错,返回 nil
arr = [1, 2, 3]
arr[10] # => nil(而非 IndexError)
# 例:块(Block)的引入让迭代变得自然
[1, 2, 3].each do |n|
puts n * 2
end
1.3 Ruby 的主要特性
1.3.1 特性概览
| 特性 |
说明 |
示例 |
| 纯面向对象 |
一切皆对象 |
5.times {} |
| 块与迭代器 |
独特的代码块概念 |
array.each { |e| } |
| 动态类型 |
运行时类型检查 |
x = 1; x = "hello" |
| 垃圾回收 |
自动内存管理 |
无需手动释放 |
| 混入(Mixin) |
模块替代多重继承 |
include Enumerable |
| 元编程 |
运行时修改类和方法 |
define_method |
| 异常处理 |
完善的异常机制 |
begin...rescue...end |
| 跨平台 |
可在主流操作系统运行 |
Windows / macOS / Linux |
1.3.2 代码风格对比
# Ruby 风格:简洁、表达力强
# 过滤偶数并求平方
(1..10).select(&:even?).map { |n| n**2 }
# => [4, 16, 36, 64, 100]
# 等价的 Python 风格
# [n**2 for n in range(1, 11) if n % 2 == 0]
# 等价的 JavaScript 风格
# Array.from({length: 10}, (_, i) => i + 1).filter(n => n % 2 === 0).map(n => n ** 2)
1.4 Ruby 生态系统
1.4.1 核心生态
| 组件 |
说明 |
用途 |
| MRI / CRuby |
官方参考实现 |
日常开发首选 |
| YJIT |
Ruby 3.1+ 内置 JIT 编译器 |
显著提升性能 |
| RubyGems |
包管理器 |
安装和管理第三方库 |
| Bundler |
依赖管理工具 |
管理项目依赖版本 |
| RDoc |
文档生成器 |
从代码注释生成文档 |
| IRB |
交互式解释器 |
交互式编程和调试 |
| Pry |
增强型 REPL |
更强大的交互式调试 |
1.4.2 主要框架
| 框架 |
类型 |
说明 |
| Ruby on Rails |
全栈 Web 框架 |
约定优于配置,快速开发 |
| Sinatra |
轻量 Web 框架 |
适合小型 API 和微服务 |
| Hanami |
现代 Web 框架 |
清晰架构,关注可维护性 |
| Jekyll |
静态站点生成器 |
博客和文档站点 |
| Vagrant |
虚拟化管理 |
开发环境自动化 |
| Homebrew |
macOS 包管理器 |
macOS 必备工具 |
1.4.3 Ruby 的实现版本
# 查看当前 Ruby 版本和实现
puts RUBY_VERSION # => "3.3.0"
puts RUBY_ENGINE # => "ruby" (MRI), "jruby", "truffleruby" 等
puts RUBY_PLATFORM # => "x86_64-linux"
| 实现 |
说明 |
适用场景 |
| CRuby (MRI) |
官方 C 语言实现 |
日常开发、生产环境 |
| JRuby |
JVM 上的 Ruby |
需要 Java 库互操作 |
| TruffleRuby |
GraalVM 上的高性能实现 |
对性能有极致要求 |
| mruby |
嵌入式 Ruby |
嵌入式系统、游戏脚本 |
1.5 适用场景
1.5.1 最佳应用场景
| 场景 |
说明 |
代表项目 |
| Web 开发 |
Rails / Sinatra 生态成熟 |
GitHub、Shopify、Basecamp |
| 脚本自动化 |
系统管理、数据处理 |
DevOps 脚本、ETL 工具 |
| API 服务 |
轻量级 REST / GraphQL API |
Stripe API、GitLab API |
| 原型开发 |
快速验证想法 |
创业公司 MVP |
| 静态站点 |
Jekyll / Hugo 集成 |
技术博客、文档站点 |
| 测试框架 |
RSpec 生态丰富 |
行为驱动开发 (BDD) |
1.5.2 知名 Ruby 用户
# 这些公司/项目都在使用 Ruby
ruby_users = {
"GitHub" => "代码托管平台,Rails 架构",
"Shopify" => "电商平台,全球最大的 Rails 应用之一",
"Basecamp" => "项目管理工具,Rails 的诞生地",
"Airbnb" => "短租平台,早期使用 Rails",
"Stripe" => "支付平台,Ruby API",
"Twitch" => "直播平台,Ruby 微服务",
"Hulu" => "流媒体,Ruby 后端",
"Cookpad" => "食谱分享,日本 Ruby 社区重要成员",
"Discourse" => "论坛系统,Rails 构建"
}
1.5.3 不太适合的场景
| 场景 |
原因 |
替代方案 |
| 系统编程 |
性能和内存控制不足 |
Rust、C++ |
| 移动开发 |
原生支持有限 |
Swift、Kotlin |
| 前端开发 |
浏览器不直接支持 |
JavaScript、TypeScript |
| 高频交易 |
GVL 限制并发 |
C++、Java |
| 嵌入式系统 |
运行时开销大 |
C、Rust |
1.6 Ruby 社区文化
1.6.1 社区价值观
Ruby 社区有着独特而温暖的文化:
- MINASWAN:Matz Is Nice And So We Are Nice(Matz 很好,所以我们也要好)
- Joy of Programming:强调编程的快乐
- Convention over Configuration:约定优于配置
- DRY:Don’t Repeat Yourself(不要重复自己)
1.6.2 社区资源
| 资源 |
链接 |
说明 |
| Ruby 官网 |
ruby-lang.org |
官方文档和新闻 |
| RubyGems |
rubygems.org |
Gem 包仓库 |
| Ruby China |
ruby-china.org |
中文社区 |
| Ruby Weekly |
rubyweekly.com |
周报 |
| Exercism |
exercism.org/tracks/ruby |
在线练习平台 |
1.6.3 年度活动
# Ruby 社区的重要活动
events = [
{ name: "RubyConf", location: "美国", type: "国际大会" },
{ name: "RailsConf", location: "美国", type: "Rails 专题" },
{ name: "RubyKaigi", location: "日本", type: "国际大会" },
{ name: "Euruko", location: "欧洲", type: "欧洲大会" },
{ name: "RubyConf China", location: "中国", type: "中国大会" },
{ name: "RubyKaigi Takeout", location: "线上", type: "线上会议" }
]
events.each do |event|
puts "#{event[:name]} (#{event[:location]}) - #{event[:type]}"
end
1.7 Ruby 与其他语言对比
1.7.1 动态语言对比
| 特性 |
Ruby |
Python |
JavaScript |
PHP |
| 类型系统 |
动态、强类型 |
动态、强类型 |
动态、弱类型 |
动态、弱类型 |
| 一切皆对象 |
✅ 完全 |
部分 |
❌ |
部分 |
| 块/迭代器 |
✅ 独特 |
生成器 |
回调/Promise |
❌ |
| 元编程 |
✅ 强大 |
✅ |
✅ |
✅ |
| Web 框架 |
Rails、Sinatra |
Django、Flask |
Express、Next |
Laravel |
| 包管理 |
Bundler/RubyGems |
pip/npm |
npm/yarn |
Composer |
| 主要领域 |
Web、脚本 |
数据科学、AI |
全栈、前端 |
Web |
| 运行速度 |
中等 |
中等 |
快(V8) |
中等 |
1.7.2 语法对比
# Ruby:块和迭代器
[1, 2, 3].each do |n|
puts n if n.even?
end
# Python
# for n in [1, 2, 3]:
# if n % 2 == 0:
# print(n)
# JavaScript
# [1, 2, 3].forEach(n => { if (n % 2 === 0) console.log(n) })
# Ruby 的块让代码更接近自然语言
5.times { puts "Hello!" }
3.times do
puts "Ruby is fun!"
end
1.8 第一个 Ruby 程序
让我们写一个简单的程序来感受 Ruby 的风格:
# greeting.rb - 一个简单的问候程序
class Greeter
attr_reader :name
def initialize(name = "World")
@name = name
end
def greet
case Time.now.hour
when 5..11
"早上好,#{@name}!☀️"
when 12..13
"中午好,#{@name}!🌞"
when 14..17
"下午好,#{@name}!🌤️"
when 18..21
"晚上好,#{@name}!🌙"
else
"夜深了,#{@name},早点休息!💤"
end
end
end
# 使用
greeter = Greeter.new("Ruby 学习者")
puts greeter.greet
运行方式:
1.9 动手练习
- 安装 Ruby:跳转到第 02 章学习如何安装 Ruby
- 打开 IRB:在终端输入
irb,尝试以下代码:
# IRB 实验
"Ruby".reverse # => "ybuR"
(1..100).sum # => 5050
"hello world".split # => ["hello", "world"]
[3, 1, 4, 1, 5].sort # => [1, 1, 3, 4, 5]
[3, 1, 4, 1, 5].uniq # => [3, 1, 4, 5]
"ruby".chars.shuffle.join # => 随机排列
1.10 本章小结
| 要点 |
说明 |
| 创造者 |
松本行弘(Matz),1995 年发布 |
| 核心理念 |
一切皆对象、最少惊讶、快乐编程 |
| 主要特性 |
块/迭代器、Mixin、元编程、动态类型 |
| 最佳场景 |
Web 开发、脚本自动化、API 服务、原型开发 |
| 社区文化 |
MINASWAN、友好互助、注重编程乐趣 |
📖 扩展阅读
下一章:第 02 章:安装与环境配置 →