强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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

运行方式:

ruby greeting.rb

1.9 动手练习

  1. 安装 Ruby:跳转到第 02 章学习如何安装 Ruby
  2. 打开 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 章:安装与环境配置 →