Ruby完全自学手册
座右铭:Ruby,为快乐编程而生。
第一部分:启程 - 认识Ruby
1 什么是Ruby?
Ruby是一种开源的、面向对象的、解释型的动态编程语言,它由日本人松本行弘(Yukihiro "Matz" Matsumoto)于1995年创造。

- 优雅: Ruby的语法非常简洁、自然,读起来像英文句子,写起来像诗歌。
- 简单: 学习曲线相对平缓,核心概念不多,让你能专注于解决问题,而不是纠结于复杂的语法。
- 强大: 拥有强大的元编程能力,可以“在运行时修改程序本身”,这赋予了它极高的灵活性。
- 面向对象: 在Ruby中,一切都是对象,数字、字符串、甚至代码块都是对象,这让你可以用统一的方式思考问题。
2 为什么要学习Ruby?
- Web开发的利器: Ruby on Rails框架极大地简化了Web应用的开发,遵循“约定优于配置”的原则,让你能快速构建功能强大的网站。
- 脚本自动化: Ruby是编写系统管理、文件处理、任务自动化脚本的绝佳选择,语法简单,功能强大。
- 数据科学与原型设计: 快速实现算法、处理数据、构建应用原型,验证想法。
- 社区与生态: 拥有活跃的社区(如Ruby China)和海量的开源库(通过RubyGems),几乎任何你能想到的功能都有现成的库可以使用。
- 纯粹的编程乐趣: 很多开发者学习Ruby是因为它带来的纯粹快乐。
3 环境准备
在学习之前,你需要准备好开发环境。
-
安装Ruby:
- macOS: 系统通常自带Ruby,但版本可能较旧,推荐使用版本管理工具(如
rbenv或RVM)来安装和管理多个Ruby版本。 - Windows: 最简单的方式是访问 RubyInstaller官网,下载并安装Ruby+Devkit,Devkit包含了编译C扩展所需的工具。
- Linux (Ubuntu/Debian): 使用包管理器安装:
sudo apt-get update && sudo apt-get install ruby-full
- macOS: 系统通常自带Ruby,但版本可能较旧,推荐使用版本管理工具(如
-
验证安装: 打开你的终端(Windows下是命令提示符或PowerShell),输入以下命令:
ruby -v
如果看到类似
ruby 3.1.2p20的输出,说明Ruby已成功安装。
-
选择代码编辑器: 一个好的编辑器能让你事半功倍,强烈推荐:
- Visual Studio Code (VS Code): 免费、强大、插件丰富,安装
Ruby、Ruby Solargraph、VSCode Ruby等插件后,体验极佳。 - RubyMine: JetBrains出品的付费IDE,功能最强大,为Ruby开发深度优化。
- Visual Studio Code (VS Code): 免费、强大、插件丰富,安装
第二部分:基础入门 - 你的第一行Ruby代码
1 交互式环境(IRB)
IRB(Interactive Ruby)是一个让你可以在命令行中直接输入Ruby代码并立即看到结果的工具,它是学习和测试代码片段的最佳工具。
在终端输入 irb 并回车,你会看到 irb(main):001:0> 提示符。
irb(main):001:0> puts "Hello, Ruby!" Hello, Ruby! => nil irb(main):002:0>
puts 是一个方法,用于在控制台打印内容。=> nil 表示 puts 方法的执行结果是 nil(空值)。

2 第一个程序(Hello, World!)
- 创建一个名为
hello.rb的文件。 - 用编辑器打开它,输入以下代码:
# 这是一个注释,Ruby会忽略它 puts "Hello, World!"
- 在终端中,进入文件所在目录,运行:
ruby hello.rb
你将在终端看到
Hello, World!的输出。
3 语法基础
- 注释: 以 开头。
- 字符串: 用单引号 或双引号 括起来。
- 单引号:所见即所得,不进行转义。
- 双引号:支持变量插值和转义字符。
name = "Alice" puts 'Hello, #{name}!' # 输出: Hello, #{name}! puts "Hello, #{name}!" # 输出: Hello, Alice!
- 变量赋值: 使用 ,变量名通常使用蛇形命名法(
snake_case)。my_name = "Bob" age = 30 is_cool = true
- 方法调用: 使用 调用对象的方法。
"hello".upcase # => "HELLO" 10.next # => 11 [1, 2, 3].length # => 3
第三部分:核心概念 - Ruby的骨架
1 数据类型
Ruby是动态类型语言,你不需要声明变量的类型。
- Numbers (数字):
Integer(整数),Float(浮点数)10 / 3 # => 3 (整数除法) 10.to_f / 3 # => 3.333... (先转为浮点数)
- Strings (字符串): 文本数据。
"ruby".class # => String 'ruby'.length # => 4
- Booleans (布尔值):
true和false。 - Nil (空值):
nil,表示“没有值”。 - Arrays (数组): 有序的列表。
fruits = ["apple", "banana", "cherry"] fruits[0] # => "apple" fruits.first # => "apple" fruits.last # => "cherry"
- Hashes (哈希): 键值对集合,类似字典或对象。
person = { name: "Charlie", age: 25 } person[:name] # => "Charlie" person.keys # => [:name, :age]
2 控制流
-
条件语句:
age = 18 if age >= 18 puts "You are an adult." elsif age >= 13 puts "You are a teenager." else puts "You are a child." end
更简洁的三元运算符:
message = age >= 18 ? "Adult" : "Not an adult"
-
循环:
times循环:times { puts "Hello!" } # 打印3次 "Hello!"each循环 (最常用):fruits = ["apple", "banana"] fruits.each do |fruit| puts "I love #{fruit}!" end # 也可以用更简洁的块语法: # fruits.each { |fruit| puts "I love #{fruit}!" }while循环:count = 0 while count < 5 puts count count += 1 end
3 方法
方法是代码的复用单元,使用 def 关键字定义。
# 定义一个方法
def greet(name)
"Hello, #{name}! Welcome to Ruby."
end
# 调用方法
message = greet("David")
puts message # => Hello, David! Welcome to Ruby.
# 没有参数的方法
def say_hi
"Hi!"
end
puts say_hi # => Hi!
4 块、Proc 和 Lambda
这是Ruby的精髓之一,也是初学者的难点。
- 块: 一段被 或
do...end包裹的代码,通常跟在方法调用后面。[1, 2, 3].each { |n| puts n * 2 } # 1. each方法接收这个块 # 2. each方法遍历数组,每次将一个元素(n)传入块中执行 - Proc: 块的对象化形式,可以将块存储在变量里。
my_proc = proc { |n| puts n * 2 } [1, 2, 3].each(&my_proc) # & 将Proc转换为块 - Lambda: 类似于Proc,但行为更严格(比如参数检查)。
理解要点: 很多Ruby内置方法(如 each, map, select)都设计成可以接收一个块,让它们在内部执行自定义的逻辑,这是Ruby代码如此灵活和富有表现力的关键。
第四部分:面向对象编程 - Ruby的灵魂
Ruby是一门纯粹的面向对象语言,这意味着你几乎所有的代码都会定义和使用类。
1 类与对象
- 类: 对象的蓝图或模板。
- 对象: 类的实例。
# 定义一个类
class Dog
# 类方法,在类本身上调用
def self.species
"Canis lupus"
end
# 实例方法,在对象上调用
def initialize(name, breed)
@name = name # @name 是一个实例变量,属于这个对象
@breed = breed
end
def bark
"#{@name} says Woof!"
end
# Getter 方法
def name
@name
end
# Setter 方法
def name=(new_name)
@name = new_name
end
end
# 创建对象(实例化)
my_dog = Dog.new("Rex", "German Shepherd")
another_dog = Dog.new("Buddy", "Golden Retriever")
puts my_dog.bark # => Rex says Woof!
puts another_dog.name # => Buddy
puts Dog.species # => Canis lupus
2 继承
一个类可以继承另一个类的特性,实现代码复用。
class Animal
def eat
"I'm eating food."
end
end
class Cat < Animal # Cat 继承自 Animal
def meow
"Meow!"
end
end
whiskers = Cat.new
puts whiskers.eat # => I'm eating food. (继承自Animal)
puts whiskers.meow # => Meow! (Cat自己的方法)
第五部分:中级进阶 - 成为Rubyist
1 模块
模块用于将功能(方法、常量)打包,但不能像类那样被实例化,主要有两个用途:
-
命名空间: 避免方法名冲突。
module MyMath PI = 3.14159 def self.sqrt(num) # ... 平方根计算逻辑 end end puts MyMath::PI -
混入: 使用
include将模块的方法混入到类中,实现多重继承的效果。module Swimmable def swim "I can swim!" end end class Duck include Swimmable # 混入Swimmable模块 end donald = Duck.new puts donald.swim # => I can swim!
2 错误处理
使用 begin...rescue...end 来优雅地处理可能出错的地方。
begin
# 可能会抛出异常的代码
result = 10 / 0
rescue ZeroDivisionError => e
# 当发生 ZeroDivisionError 时,执行这里的代码
puts "Oops! You can't divide by zero. Error: #{e.message}"
result = nil
ensure
# 无论是否发生异常,这里的代码都会执行
puts "Calculation finished."
end
puts "The result is #{result}"
3 标准库
Ruby自带了大量功能强大的标准库,无需安装即可使用。
File,Dir: 文件和目录操作。JSON: 处理JSON数据。Net::HTTP: 发送HTTP请求。Date,Time: 处理日期和时间。
示例:读取文件
# 假设有一个文件 'greetings.txt' 内容为 "Hello"
content = File.read('greetings.txt')
puts content
第六部分:实战演练 - 构建你的第一个项目
让我们来构建一个简单的命令行待办事项应用。
项目目标:
- 可以添加新的待办事项。
- 可以查看所有待办事项。
- 可以标记一个待办事项为已完成。
步骤:
-
创建项目文件夹和文件:
mkdir todo_app cd todo_app touch todo_app.rb
-
设计数据结构: 我们用一个数组来存储待办事项,每个事项是一个哈希,包含
task(内容) 和done(状态)。 -
编写代码 (
todo_app.rb):#!/usr/bin/env ruby # 数据存储 $todos = [] # 显示菜单 def show_menu puts "\n--- Todo App ---" puts "1. Add a new todo" puts "2. View all todos" puts "3. Mark a todo as done" puts "4. Exit" print "Enter your choice: " end # 添加待办事项 def add_todo print "Enter the task: " task = gets.chomp $todos << { task: task, done: false } puts "Todo added!" end # 查看待办事项 def view_todos puts "\n--- Your Todos ---" if $todos.empty? puts "No todos yet." else $todos.each_with_index do |todo, index| status = todo[:done] ? "[X]" : "[ ]" puts "#{index + 1}. #{status} #{todo[:task]}" end end end # 标记完成 def mark_done view_todos print "Enter the number of the todo to mark as done: " choice = gets.chomp.to_i if choice > 0 && choice <= $todos.length $todos[choice - 1][:done] = true puts "Todo marked as done!" else puts "Invalid choice." end end # 主程序循环 loop do show_menu choice = gets.chomp.to_i case choice when 1 add_todo when 2 view_todos when 3 mark_done when 4 puts "Goodbye!" break else puts "Invalid choice. Please try again." end end -
运行你的应用: 在终端中,确保你在
todo_app目录下,然后运行:ruby todo_app.rb
恭喜!你已经用Ruby构建了你的第一个应用程序,你可以尝试为它添加更多功能,比如删除待办事项、保存到文件等。
第七部分:持续学习与资源
自学是一个持续的过程,以下是帮助你继续前进的资源:
1 进阶学习方向
- Ruby on Rails: 学习如何用Ruby构建现代化的Web应用。
- 元编程: 深入了解
define_method,method_missing等高级特性。 - 并发编程: 学习
Thread,Fiber,async等概念。 - 测试: 学习
RSpec,Minitest等测试框架,编写高质量代码。
2 推荐资源
- 官方文档:
- 在线教程:
- 书籍:
- 《Eloquent Ruby》: 进阶必读,教你如何写出地道、优雅的Ruby代码。
- 《Programming Ruby》(The Pickaxe Book): Ruby的“圣经”,非常全面。
- 《Ruby on Rails Tutorial》 by Michael Hartl: 学习Rails的权威指南。
- 社区:
- Ruby China: 国内最活跃的Ruby社区论坛。
- Reddit (r/ruby): 国际Ruby社区。
- Stack Overflow: 解决具体编程问题的首选。
3 实践,实践,再实践
- 解决小问题: 在Codewars、LeetCode等网站上刷Ruby相关的题目。
- 参与开源项目: 从修复一个简单的bug或改进文档开始。
- 构建个人项目: 这是最好的学习方式,写一个博客、一个API客户端、一个工具脚本...
请记住:
"The principle is: Don't repeat yourself. Every piece of knowledge must have a single, unambiguous, authoritative representation within a system." (DRY原则) —— 松本行弘
享受Ruby带来的编程乐趣吧!祝你在Ruby的世界里探索愉快!