Ruby 入门指南 / 第 03 章:Hello World
第 03 章:Hello World
“千里之行,始于足下。” —— 《道德经》
3.1 IRB:交互式 Ruby Shell
IRB(Interactive Ruby)是 Ruby 自带的交互式解释器,是学习和调试 Ruby 的利器。
3.1.1 启动 IRB
# 直接启动
irb
# 指定提示符模式
irb --prompt simple # 简洁模式
irb --prompt default # 默认模式
# 加载特定 gem
irb -r colorize
3.1.2 IRB 基础操作
# 简单计算
irb(main):001:0> 1 + 1
=> 2
# 字符串操作
irb(main):002:0> "Hello, Ruby!".upcase
=> "HELLO, RUBY!"
# 变量赋值
irb(main):003:0> name = "Matz"
=> "Matz"
# 查看变量类型
irb(main):004:0> name.class
=> String
# 查看对象方法
irb(main):005:0> "hello".methods.sort
# => 返回方法列表
# 查看帮助
irb(main):006:0> help
irb(main):007:0> show_source String#upcase
3.1.3 IRB 实用技巧
| 技巧 | 说明 | 示例 |
|---|
_ | 上一次返回值 | 1 + 1; _ + 3 → 5 |
__ | 倒数第二次返回值 | — |
exit / quit | 退出 IRB | — |
Ctrl+D | 退出 IRB | — |
Ctrl+C | 取消当前输入 | — |
Ctrl+L | 清屏 | — |
hist | 查看历史命令 | — |
3.1.4 IRB 配置
# ~/.irbrc - IRB 启动配置
require "irb/completion" # 自动补全
IRB.conf[:AUTO_INDENT] = true # 自动缩进
IRB.conf[:ECHO] = true # 显示返回值
IRB.conf[:PROMPT_MODE] = :SIMPLE # 简洁提示符
# 自定义提示符
IRB.conf[:PROMPT][:MY_PROMPT] = {
PROMPT_I: "ruby> ",
PROMPT_S: "ruby| ",
PROMPT_C: "ruby> ",
RETURN: "=> %s\n"
}
IRB.conf[:PROMPT_MODE] = :MY_PROMPT
3.2 Pry:增强型 REPL
Pry 是一个功能更强大的 Ruby REPL,支持语法高亮、源码浏览和调试。
# 安装
gem install pry
# 启动
pry
# 常用功能
# 1. 语法高亮
[1] pry(main)> "hello".upcase
=> "HELLO"
# 2. 查看源码
[2] pry(main)> show-method String#upcase
# 显示方法的源码
# 3. 查看文档
[3] pry(main)> show-doc String#upcase
# 显示方法的文档
# 4. 进入对象上下文
[4] pry(main)> cd "hello"
[5] pry("hello"):1> upcase
=> "HELLO"
[6] pry("hello"):1> cd ..
[7] pry(main)>
# 5. 代码导航
[8] pry(main)> ls String # 列出 String 的方法和变量
3.3 Ruby 脚本运行
3.3.1 创建第一个脚本
# hello.rb - 第一个 Ruby 脚本
#!/usr/bin/env ruby
# frozen_string_literal: true # Ruby 2.3+ 冻结字符串字面量
# 方法定义
def greet(name)
"Hello, #{name}! Welcome to Ruby!"
end
# 主程序
if __FILE__ == $PROGRAM_NAME
name = ARGV[0] || "World"
puts greet(name)
# 打印系统信息
puts "\n--- 系统信息 ---"
puts "Ruby 版本: #{RUBY_VERSION}"
puts "平台: #{RUBY_PLATFORM}"
puts "脚本路径: #{__FILE__}"
puts "当前时间: #{Time.now}"
end
3.3.2 运行脚本
# 方式 1:使用 ruby 命令
ruby hello.rb
ruby hello.rb Ruby 学习者
# 方式 2:添加执行权限
chmod +x hello.rb
./hello.rb
./hello.rb Ruby 学习者
# 方式 3:内联运行
ruby -e 'puts "Hello, Ruby!"'
# 方式 4:从标准输入读取
echo 'puts "Hello!"' | ruby
# 方式 5:使用 heredoc
ruby << 'RUBY'
puts "Hello from heredoc!"
puts "Ruby version: #{RUBY_VERSION}"
RUBY
3.3.3 Shebang 行
#!/usr/bin/env ruby # 推荐:使用 env 查找 ruby
#!/usr/bin/ruby # 直接指定路径(不推荐)
#!/usr/bin/env ruby -w # 启用警告
#!/usr/bin/env ruby --enable-frozen-string-literal # 冻结字符串
3.3.4 脚本参数
# args_demo.rb
# ARGV 是命令行参数数组
puts "参数数量: #{ARGV.length}"
puts "所有参数: #{ARGV.inspect}"
ARGV.each_with_index do |arg, index|
puts "参数 #{index}: #{arg}"
end
# 读取标准输入
if ARGV.empty?
puts "请输入内容(Ctrl+D 结束):"
input = $stdin.read
puts "你输入了: #{input}"
end
ruby args_demo.rb foo bar baz
# 参数数量: 3
# 所有参数: ["foo", "bar", "baz"]
# 参数 0: foo
# 参数 1: bar
# 参数 2: baz
3.4 Ruby 项目结构
3.4.1 标准项目布局
my_project/
├── Gemfile # 依赖声明
├── Gemfile.lock # 依赖锁定文件
├── Rakefile # Rake 任务定义
├── README.md # 项目说明
├── LICENSE # 许可证
├── .ruby-version # rbenv 版本文件
├── .gitignore # Git 忽略规则
├── .rubocop.yml # RuboCop 配置
├── bin/ # 可执行文件
│ ├── console # 交互式控制台
│ ├── setup # 项目初始化脚本
│ └── my_app # 主程序入口
├── lib/ # 库代码
│ ├── my_project.rb # 主模块
│ └── my_project/
│ ├── version.rb # 版本定义
│ ├── config.rb # 配置
│ └── core.rb # 核心功能
├── spec/ # 测试代码(RSpec)
│ ├── spec_helper.rb
│ └── my_project/
│ └── core_spec.rb
├── test/ # 测试代码(Minitest)
│ ├── test_helper.rb
│ └── test_core.rb
├── config/ # 配置文件
│ └── database.yml
├── db/ # 数据库相关(Rails)
│ └── migrations/
├── docs/ # 文档
├── tmp/ # 临时文件
└── log/ # 日志文件
3.4.2 bin/console 和 bin/setup
#!/usr/bin/env ruby
# bin/console - 交互式控制台
require "bundler/setup"
require_relative "../lib/my_project"
# 加载 Pry 或 IRB
begin
require "pry"
Pry.start
rescue LoadError
require "irb"
IRB.start
end
#!/usr/bin/env bash
# bin/setup - 项目初始化脚本
set -e
echo "==> 安装依赖..."
bundle check || bundle install
echo "==> 准备数据库..."
# bundle exec rake db:setup
echo "==> 完成!"
3.4.3 .gitignore 模板
# Ruby
*.gem
*.rbc
/.config
/coverage/
/InstalledFiles
/pkg/
/spec/reports/
/spec/examples.txt
/test/tmp/
/test/version_tmp/
/tmp/
# Bundler
/.bundle/
/vendor/bundle
Gemfile.lock
# IDE
.idea/
.vscode/
*.swp
*.swo
# 环境变量
.env
.env.local
# 日志
/log/*
/tmp/*
3.5 Rake:Ruby 的 Make
3.5.1 Rakefile 基础
# Rakefile
require "rake"
# 默认任务
task default: :test
# 定义任务
task :hello do
puts "Hello from Rake!"
end
# 带描述的任务
desc "运行测试"
task :test do
sh "ruby -Ilib -Itest test/**/*_test.rb"
end
desc "启动开发服务器"
task :server do
sh "ruby bin/server.rb"
end
desc "清理临时文件"
task :clean do
rm_rf "tmp"
rm_rf "pkg"
puts "清理完成"
end
# 任务依赖
task build: [:clean, :test] do
sh "gem build my_project.gemspec"
end
# 命名空间
namespace :db do
desc "创建数据库"
task :create do
puts "创建数据库..."
end
desc "运行迁移"
task :migrate do
puts "运行迁移..."
end
desc "重置数据库"
task reset: [:drop, :create, :migrate]
end
# 运行 Rake 任务
rake hello # 运行 hello 任务
rake -T # 列出所有任务(带描述)
rake db:migrate # 运行命名空间中的任务
3.6 Gems:Ruby 的包管理
3.6.1 Gem 基础
# 搜索 gem
gem search httparty
# 安装 gem
gem install httparty
# 卸载 gem
gem uninstall httparty
# 查看已安装的 gem
gem list
# 查看特定 gem 信息
gem info httparty
# 更新 gem
gem update httparty
# 更新所有 gem
gem update
3.6.2 常用 Gem 推荐
| 分类 | Gem | 说明 |
|---|
| Web 框架 | rails | 全栈 Web 框架 |
| Web 框架 | sinatra | 轻量 Web 框架 |
| HTTP | httparty | 简洁的 HTTP 客户端 |
| HTTP | faraday | 灵活的 HTTP 客户端 |
| JSON | oj | 高性能 JSON 解析 |
| 测试 | rspec | 行为驱动测试框架 |
| 测试 | minitest | 标准库测试框架 |
| 代码质量 | rubocop | 代码风格检查 |
| 调试 | pry | 增强型 REPL |
| 调试 | byebug | 调试器 |
| 日志 | logger | 标准库日志 |
| 配置 | dotenv | 环境变量管理 |
| 数据库 | pg | PostgreSQL 驱动 |
| 数据库 | sqlite3 | SQLite 驱动 |
| 序列化 | msgpack | 高效二进制序列化 |
3.6.3 使用 Gem 的示例
# 使用 httparty 发送 HTTP 请求
require "httparty"
response = HTTParty.get("https://api.github.com/users/mattn")
user = response.parsed_response
puts "用户名: #{user['login']}"
puts "姓名: #{user['name']}"
puts "仓库数: #{user['public_repos']}"
puts "粉丝: #{user['followers']}"
# 使用 colorize 彩色输出
require "colorize"
puts "成功!".green
puts "警告!".yellow
puts "错误!".red
puts "信息".blue.bold
puts "背景色".on_green
3.7 Ruby 命令行工具
3.7.1 ruby 命令选项
# 常用选项
ruby -v # 显示版本
ruby -e 'code' # 执行代码
ruby -c script.rb # 语法检查
ruby -w script.rb # 启用警告
ruby -W2 script.rb # 更多警告
ruby -d script.rb # 调试模式
ruby -r lib script.rb # 预加载库
# 组合使用
ruby -e 'puts RUBY_VERSION'
ruby -cw script.rb # 检查语法并显示警告
3.7.2 一行式(One-liner)
# 搜索和替换
echo "Hello World" | ruby -pe 'gsub(/World/, "Ruby")'
# 过滤行
ruby -ne 'puts $_ if /pattern/' file.txt
# 计算行数
ruby -ne 'END { puts NR }' file.txt
# 处理 CSV
ruby -rcsv -ne 'row = CSV.parse_line($_); puts row[1]' data.csv
# JSON 处理
echo '{"name":"Ruby","version":3}' | ruby -rjson -e '
data = JSON.parse($stdin.read)
puts "#{data["name"]} v#{data["version"]}"
'
3.7.3 其他 Ruby 工具
| 工具 | 说明 | 用法 |
|---|
irb | 交互式解释器 | irb |
erb | ERB 模板引擎 | erb template.erb |
rake | 任务运行器 | rake task |
gem | 包管理器 | gem install |
bundle | 依赖管理 | bundle install |
rdoc | 文档生成器 | rdoc lib/ |
ri | API 文档查看 | ri String#upcase |
3.8 编码规范初探
3.8.1 Ruby 命名约定
| 类型 | 约定 | 示例 |
|---|
| 变量 | snake_case | user_name, max_count |
| 方法 | snake_case | calculate_total, valid? |
| 类 | PascalCase | UserAccount, HttpService |
| 模块 | PascalCase | Enumerable, Comparable |
| 常量 | SCREAMING_SNAKE_CASE | MAX_SIZE, API_URL |
| 全局变量 | $前缀 | $stdout, $LOAD_PATH |
| 实例变量 | @前缀 | @name, @count |
| 类变量 | @@前缀 | @@count, @@config |
| 布尔方法 | ?结尾 | empty?, valid?, nil? |
| 危险方法 | !结尾 | map!, gsub!, reverse! |
3.8.2 代码风格示例
# ✅ 好的风格
class UserAccount
MAX_LOGIN_ATTEMPTS = 5
attr_reader :username, :email
def initialize(username, email)
@username = username
@email = email
@login_attempts = 0
end
def locked?
@login_attempts >= MAX_LOGIN_ATTEMPTS
end
def attempt_login(password)
return false if locked?
if authenticate(password)
@login_attempts = 0
true
else
@login_attempts += 1
false
end
end
private
def authenticate(password)
# 验证逻辑
@password_hash == Digest::SHA256.hexdigest(password)
end
end
# ❌ 不好的风格
class user_account # 类名应该用 PascalCase
def AttemptLogin(pwd) # 方法名应该用 snake_case
if pwd == @Pwd # 变量名不清晰
return true
else
return false # 多余的 return
end
end
end
3.9 动手练习
- IRB 实验:打开 IRB,尝试以下操作
# 创建数组和哈希
fruits = ["apple", "banana", "cherry"]
prices = { apple: 5, banana: 3, cherry: 8 }
# 使用迭代器
fruits.each_with_index { |f, i| puts "#{i + 1}. #{f}" }
# 链式调用
fruits.select { |f| f.start_with?("a") }.map(&:upcase)
# 字符串操作
"hello world".split(" ").map(&:capitalize).join(" ")
- 创建脚本:编写一个脚本,接受命令行参数并输出问候语
- Rake 任务:创建一个 Rakefile,定义清理和测试任务
3.10 本章小结
| 要点 | 说明 |
|---|
| IRB | Ruby 交互式解释器,学习和调试的利器 |
| Pry | 增强型 REPL,支持源码浏览和调试 |
| 脚本运行 | ruby script.rb 或添加 shebang 后直接执行 |
| 项目结构 | lib/、spec/、bin/、Gemfile 是核心 |
| Gems | 通过 Bundler 和 Gemfile 管理依赖 |
| Rake | Ruby 的任务运行器 |
📖 扩展阅读
上一章:← 第 02 章:安装与环境配置
下一章:第 04 章:变量与数据类型 →