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

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官方参考实现日常开发首选
YJITRuby 3.1+ 内置 JIT 编译器显著提升性能
RubyGems包管理器安装和管理第三方库
Bundler依赖管理工具管理项目依赖版本
RDoc文档生成器从代码注释生成文档
IRB交互式解释器交互式编程和调试
Pry增强型 REPL更强大的交互式调试

1.4.2 主要框架

框架类型说明
Ruby on Rails全栈 Web 框架约定优于配置,快速开发
Sinatra轻量 Web 框架适合小型 API 和微服务
Hanami现代 Web 框架清晰架构,关注可维护性
Jekyll静态站点生成器博客和文档站点
Vagrant虚拟化管理开发环境自动化
HomebrewmacOS 包管理器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 语言实现日常开发、生产环境
JRubyJVM 上的 Ruby需要 Java 库互操作
TruffleRubyGraalVM 上的高性能实现对性能有极致要求
mruby嵌入式 Ruby嵌入式系统、游戏脚本

1.5 适用场景

1.5.1 最佳应用场景

场景说明代表项目
Web 开发Rails / Sinatra 生态成熟GitHub、Shopify、Basecamp
脚本自动化系统管理、数据处理DevOps 脚本、ETL 工具
API 服务轻量级 REST / GraphQL APIStripe 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官方文档和新闻
RubyGemsrubygems.orgGem 包仓库
Ruby Chinaruby-china.org中文社区
Ruby Weeklyrubyweekly.com周报
Exercismexercism.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 动态语言对比

特性RubyPythonJavaScriptPHP
类型系统动态、强类型动态、强类型动态、弱类型动态、弱类型
一切皆对象✅ 完全部分部分
块/迭代器✅ 独特生成器回调/Promise
元编程✅ 强大
Web 框架Rails、SinatraDjango、FlaskExpress、NextLaravel
包管理Bundler/RubyGemspip/npmnpm/yarnComposer
主要领域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 章:安装与环境配置 →