Ruby 编程基础:优雅的脚本语言
Ruby 编程基础:优雅的脚本语言
Ruby 是一门为“程序员快乐”而生的动态脚本语言。它语法自然、表现力强,既能快速开发原型,又能构建大型项目。本教程从零开始,带你掌握 Ruby 的核心概念与编程风格。
认识 Ruby
Ruby 由松本行弘(Matz)于1995年发布,设计初衷是平衡函数式与命令式编程,同时让代码贴近人类语言。它完全面向对象:一切皆对象,包括数字、布尔值甚至 nil(空值)。Ruby 还是强类型、动态类型的语言,变量无需声明类型,运行时才会检查。
与 Python 的“做一件事应该有唯一明显的方式”不同,Ruby 信奉“有多种方法做同一件事”(TIMTOWTDI),赋予开发者更多表达自由。
环境准备
安装 Ruby
- Windows:使用 RubyInstaller(rubyinstaller.org)下载并运行安装包,勾选“Add Ruby to PATH”。
- macOS:系统自带 Ruby,但版本较旧。推荐通过 Homebrew 安装:
brew install ruby。 - Linux:使用包管理器,如 Ubuntu:
sudo apt install ruby-full。
安装完成后,终端输入以下命令确认版本:
ruby -v
交互式运行:IRB
IRB(Interactive Ruby Shell)是常用的即时执行环境,输入 irb 即可进入。它是学习语法和快速测试的理想工具。
irb(main):001> puts "Hello, Ruby!"
Hello, Ruby!
=> nil
基础语法与约定
输出与注释
puts "打印并换行"
print "打印不换行"
# 这是单行注释
=begin
这是
多行注释
=end
变量命名
Ruby 根据变量前缀判断作用域:
| 前缀 | 示例 | 说明 |
|---|---|---|
| 小写字母或下划线 | name, _count |
局部变量 |
@ |
@age |
实例变量 |
@@ |
@@total |
类变量 |
$ |
$version |
全局变量 |
| 大写字母开头 | PI = 3.14 |
常量(可修改但会警告) |
方法调用与括号
调用方法时括号可选,但为提高可读性,建议多数场合保留括号。
puts("Hello") # 推荐
puts "Hello" # 也可以
数据类型与对象
数字(Numeric)
整数和浮点数都是对象,拥有丰富的方法。
10.class # => Integer
3.14.class # => Float
-5.abs # => 5
2.7.round # => 3
10.next # => 11
字符串(String)
字符串可变,支持单引号(不转义)和双引号(支持转义与内插)。
name = "Ruby"
greeting = "Hello, #{name}!" # 内插:"Hello, Ruby!"
# 常用方法
"ruby".upcase # => "RUBY"
" Ruby ".strip # => "Ruby"
"hello,world".split(",") # => ["hello", "world"]
符号(Symbol)
符号是不可变、唯一的标识符,常用于散列的键和表示状态。
:status.class # => Symbol
:ok.object_id # 同一个符号始终拥有相同的object_id
布尔值与 nil
true、false 和 nil 分别是 TrueClass、FalseClass 和 NilClass 的唯一实例。只有 false 和 nil 被视为“假”,其他一切(包括 0 和空字符串)都是“真”。
数组(Array)与散列(Hash)
数组有序,散列存储键值对。
colors = ["red", "green", "blue"]
colors[0] # => "red"
colors << "yellow" # 追加元素
person = { name: "Alice", age: 30 } # 新式键(符号)
person[:name] # => "Alice"
person[:city] = "NY"
控制流程
条件语句
if/elsif/else 和 unless(否定条件)让逻辑清晰。
score = 85
if score >= 90
grade = "A"
elsif score >= 80
grade = "B"
else
grade = "C"
end
# unless 等价于 if not
unless grade == "A"
puts "继续努力"
end
循环与迭代
Ruby 的循环方式多样,迭代器(如 .each)更符合语言习惯。
# while 循环
i = 0
while i < 3
puts i
i += 1
end
# for 循环(很少用,推荐 each)
for num in [1, 2, 3]
puts num * 2
end
# each 迭代器
[10, 20, 30].each do |value|
puts "Value: #{value}"
end
# times 循环
5.times { |n| puts "Round #{n}" }
条件修饰符
当语句体只有一行时,可将 if/unless/while 放在末尾,增强可读性。
puts "大于50" if score > 50
puts "继续" while count < 10
方法与块
方法定义与返回值
方法默认返回最后一个表达式的值,无需显式 return。
def greet(name)
"Hi, #{name}!" # 自动返回
end
puts greet("Tom") # => Hi, Tom!
参数可带默认值:
def multiply(a, b = 2)
a * b
end
multiply(5) # => 10
块(Block)
块是可以传递给方法的匿名代码段,是 Ruby 强大的功能之一。方法通过 yield 调用块。
def twice
yield
yield
end
twice { puts "执行" }
# 执行
# 执行
带参数的块:
[1, 2, 3].map { |n| n * n } # => [1, 4, 9]
块与方法结合
自定义方法接收块并控制流程:
def process_array(arr)
return unless block_given?
for item in arr
yield(item)
end
end
process_array([2, 3, 4]) { |x| puts x * 10 }
# 20 30 40
类与对象
定义类
用 class 关键字定义,initialize 是构造方法。实例变量以 @ 开头。
class Book
def initialize(title, author)
@title = title
@author = author
end
def description
"#{@title} by #{@author}"
end
end
book = Book.new("1984", "Orwell")
puts book.description
访问器
Ruby 提供 attr_reader、attr_writer 和 attr_accessor 快速生成 getter/setter。
class Person
attr_accessor :name, :age # 同时产生读取和写入方法
def initialize(name, age)
@name = name
@age = age
end
end
p = Person.new("Bob", 25)
p.name = "Alice"
puts p.age # => 25
继承
使用 < 实现单继承,super 调用父类方法。
class Animal
def speak
"动物发声"
end
end
class Dog < Animal
def speak
super + ":汪汪"
end
end
puts Dog.new.speak # => 动物发声:汪汪
常用内置模块与习惯用法
输入输出
print "请输入名字:"
name = gets.chomp
puts "你好,#{name}!"
字符串转数组或符号
"apple,banana".split(",") # => ["apple", "banana"]
"status".to_sym # => :status
常用技巧
- 安全导航操作符
&.:避免nil错误。user&.address&.city - 三元运算符:
condition ? true_val : false_val - 案例匹配:
case可匹配类、范围等。grade = case score when 90..100 then "A" when 80..89 then "B" else "C" end
编写惯用 Ruby 代码(Idiomatic Ruby)
- 多用迭代器代替手动循环。
- 使用
map、select、reduce等链式操作集合。 - 方法名以
?结尾表示返回布尔值(如empty?),以!结尾表示危险操作或原地修改(如strip!)。 - 利用块和
yield实现控制反转和 DSL 风格代码。
下一步学习
- 探索 Ruby 的模块(
module)和混入(mixin)机制,理解组织代码的灵活方式。 - 学习 RubyGems 管理库依赖,尝试 Sinatra 快速搭建 Web 应用。
- 阅读《Programming Ruby》和《The Ruby Way》进阶。
- 掌握测试框架(RSpec、Minitest),编写可靠程序。
Ruby 的优雅在于让你专注于问题本身,而非语法噪音。愿你享受用 Ruby 表达的乐趣。