Ruby 编程基础:优雅的脚本语言

FreeGuideOnline 最新 2026-06-13

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

truefalsenil 分别是 TrueClassFalseClassNilClass 的唯一实例。只有 falsenil 被视为“假”,其他一切(包括 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/elseunless(否定条件)让逻辑清晰。

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_readerattr_writerattr_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)

  1. 多用迭代器代替手动循环。
  2. 使用 mapselectreduce 等链式操作集合。
  3. 方法名以 ? 结尾表示返回布尔值(如 empty?),以 ! 结尾表示危险操作或原地修改(如 strip!)。
  4. 利用块和 yield 实现控制反转和 DSL 风格代码。

下一步学习

  • 探索 Ruby 的模块(module)和混入(mixin)机制,理解组织代码的灵活方式。
  • 学习 RubyGems 管理库依赖,尝试 Sinatra 快速搭建 Web 应用。
  • 阅读《Programming Ruby》和《The Ruby Way》进阶。
  • 掌握测试框架(RSpec、Minitest),编写可靠程序。

Ruby 的优雅在于让你专注于问题本身,而非语法噪音。愿你享受用 Ruby 表达的乐趣。