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

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; _ + 35
__倒数第二次返回值
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 框架
HTTPhttparty简洁的 HTTP 客户端
HTTPfaraday灵活的 HTTP 客户端
JSONoj高性能 JSON 解析
测试rspec行为驱动测试框架
测试minitest标准库测试框架
代码质量rubocop代码风格检查
调试pry增强型 REPL
调试byebug调试器
日志logger标准库日志
配置dotenv环境变量管理
数据库pgPostgreSQL 驱动
数据库sqlite3SQLite 驱动
序列化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
erbERB 模板引擎erb template.erb
rake任务运行器rake task
gem包管理器gem install
bundle依赖管理bundle install
rdoc文档生成器rdoc lib/
riAPI 文档查看ri String#upcase

3.8 编码规范初探

3.8.1 Ruby 命名约定

类型约定示例
变量snake_caseuser_name, max_count
方法snake_casecalculate_total, valid?
PascalCaseUserAccount, HttpService
模块PascalCaseEnumerable, Comparable
常量SCREAMING_SNAKE_CASEMAX_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 动手练习

  1. 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(" ")
  1. 创建脚本:编写一个脚本,接受命令行参数并输出问候语
# 你的代码...
  1. Rake 任务:创建一个 Rakefile,定义清理和测试任务

3.10 本章小结

要点说明
IRBRuby 交互式解释器,学习和调试的利器
Pry增强型 REPL,支持源码浏览和调试
脚本运行ruby script.rb 或添加 shebang 后直接执行
项目结构lib/、spec/、bin/、Gemfile 是核心
Gems通过 Bundler 和 Gemfile 管理依赖
RakeRuby 的任务运行器

📖 扩展阅读


上一章← 第 02 章:安装与环境配置 下一章第 04 章:变量与数据类型 →