Skip to content

Ruby 快速指南

本指南提供了 Ruby 核心概念和语法元素的简明概述,并根据现代 Ruby 实践进行了更新。

Ruby 是一种动态的、开源的编程语言,专注于简洁和生产力。它拥有优雅的语法,易于阅读和编写。Ruby 由日本的 Yukihiro “Matz” Matsumoto 在 20 世纪 90 年代中期创建,是一种纯粹的面向对象语言,其中一切都是对象。

irb 是 Ruby 的交互式 shell(REPL)。它允许你执行 Ruby 代码片段并立即查看结果,非常适合实验和学习。只需在终端中输入 irb 即可启动。

  • 空白符: 通常被忽略,除非在字符串字面量中。缩进是为了可读性。
  • 行结束符: 换行通常表示语句结束。分号(;)可用于在一行中分隔多个语句,但很少使用。
  • 标识符: 变量、方法等的名称。大小写敏感。约定:变量/方法使用 snake_case,类/模块使用 CamelCase,常量使用 UPPER_SNAKE_CASE。
  • 注释: 单行注释以 # 开头。多行注释以 =begin 和 =end(各占一行)包围。

具有特殊含义的词,例如 if、else、while、class、def、module、end、true、false、nil。(请参阅语法章节以获取更完整的列表)。

用于创建多行字符串。常见的有 <<DELIMITER、<<'DELIMITER'(不插值)和 <<~DELIMITER(波浪线 heredoc,移除前导空白符)。

name = "Alice"
message = <<~TEXT
Hello, #{name}!
Welcome to the system.
TEXT
puts message

数字:

  • Integer:整数(例如,123、-50、0、1_000_000)。Ruby 自动处理大整数(以前是单独的 Fixnum 和 Bignum)。
  • Float:带小数点的数字(例如,3.14、-0.001、2.0e3)。

字符串: 字符序列。

  • 单引号('...'):字面量字符串,插值能力最小(仅 \' 和 \\)。
  • 双引号("..."):支持插值(#{expression})和转义序列(例如,\n、\t)。
  • 百分号字符串:%q{...}(字面量,类似单引号),%Q{...} 或 %{...}(插值,类似双引号)。

符号: 轻量级、不可变的标识符,常用于哈希键或引用方法名。以冒号开头(例如,:name、:status)。

布尔值: true 和 false。

nil: 表示没有值。

数组: 有序的对象集合。字面量表示:[1, "two", :three]。

哈希(字典): 键值对集合。

  • 旧语法:{"name" => "Bob", "age" => 30}
  • 现代语法(Ruby 1.9+)用于符号键:{name: "Alice", age: 25}(这等同于 {:name => "Alice", :age => 25})

范围: 表示一个区间。(1..5)(包含:1,2,3,4,5),(1...5)(不包含:1,2,3,4)。

  • 局部变量: my_variable(作用域限于当前块、方法或文件)。
  • 实例变量: @my_variable(属于类的实例)。
  • 类变量: @@my_variable(在类及其所有实例之间共享;由于继承行为,请谨慎使用)。
  • 全局变量: $my_variable(从任何地方都可访问;通常不推荐使用)。
  • 常量: MY_CONSTANT(值在初始化后不应更改;按词法作用域)。

不能赋值的特殊变量:

  • self:当前方法的接收者对象。
  • true, false, nil:表示这些值的单例实例。
  • FILE:当前源文件的名称。
  • LINE:源文件中的当前行号。
  • ENCODING:当前文件的脚本编码。

选定的预定义变量(尽可能使用现代替代方案):

Section titled “选定的预定义变量(尽可能使用现代替代方案):”

Ruby 有许多 Perl 风格的预定义全局变量。虽然它们存在,但现代 Ruby 通常更倾向于使用更具描述性的方法调用。这里列举一些:

变量描述
$!最后抛出的异常对象。(使用 rescue => e 捕获)。
$@最后异常的堆栈回溯。(使用 e.backtrace)。
$/输入记录分隔符(默认为换行符)。
$.通过 gets 从当前输入文件读取的最后一行的行号(ARGF.lineno)。
$<ARGF 的别名(来自参数或 STDIN 的文件的虚拟连接)。
$0正在执行的当前 Ruby 脚本的名称。
$$当前 Ruby 脚本的进程 ID。
$LOAD_PATH 或 :$使用 require 加载文件时搜索的目录数组。
$stdin, $stdout, $stderr默认的标准输入、输出和错误流。

$SAFE 变量及其安全级别很大程度上是历史遗留的,不被视为现代应用程序的强大安全机制。请依赖其他的安全实践。

常量描述
TRUE, FALSE, NILtrue, false, nil 的已弃用大写版本。避免使用。
ARGF用于从 ARGV 中的文件或 STDIN 读取的流。
ARGV命令行参数数组。
ENV类似哈希的方式访问环境变量。
RUBY_VERSION包含当前 Ruby 版本的字符串(例如,“3.2.2”)。
RUBY_PLATFORM标识解释器平台的字符串。
STDIN, STDOUT, STDERR标准 I/O 流。

字面量:/pattern/,%r{pattern}。选项:i(忽略大小写),m(多行 - . 匹配换行符),x(扩展 - 忽略空白符,允许注释)。

Example: `name = "John Doe"; if name =~ /john/i then puts "Match found!" end`

最佳实践是使用带块的 File.open,以确保文件自动关闭。

File.open("my_file.txt", "r") do |file|
file.each_line do |line|
puts line
end
end
File.write("output.txt", "Hello from Ruby!") # 写文件的简单方法

模式:"r"(读),"w"(写,截断),"a"(追加),"r+"(读写)等。

Ruby 有一套丰富的运算符,其中大部分是方法。优先级(从高到低,简化):

  • ::, . (访问)
  • [] (元素访问), ** (幂)
  • !, ~, 一元 +, - (非, 按位非, 一元正/负)
  • *, /, % (乘, 除, 模)
  • +, - (加, 减)
  • <<, >> (按位移位)
  • & (按位与)
  • |, ^ (按位或, 按位异或)
  • >, >=, <, <= (比较)
  • <=>, ==, ===, !=, =, ! (相等性, 模式匹配)
  • && (逻辑与)
  • || (逻辑或)
  • .., … (范围创建)
  • 三元运算符: ? :
  • 赋值: =, +=, -=, 等。
  • not (逻辑非, 优先级较低)
  • and, or (逻辑与/或, 优先级较低)

不确定时,使用括号 () 来明确顺序或强制优先级。

  • if condition ... elsif condition ... else ... end
  • unless condition ... else ... end (如果条件为假则执行)
  • 后缀 if/unless:statement if condition
  • case expression when value ... else ... end
  • while condition ... end
  • until condition ... end
  • 迭代器(集合首选): collection.each { |item| ... },n.times { ... },collection.map { ... }
  • for item in collection ... end (不如 each 常用)
  • 循环控制: break (退出循环),next (跳到下一次迭代),redo (重新开始当前迭代),retry (主要在 rescue 块中用于重新开始 begin 块)。
class MyClass
attr_accessor :name # 创建 @name 的 getter 和 setter
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}!"
end
def self.class_method # 一个类方法
"I am a class method."
end
end
module MyModule
def utility_method
"这是一个实用方法。"
end
end
class AnotherClass
include MyModule # 混入 MyModule 的实例方法
end
obj = MyClass.new("RubyDev")
puts obj.greet
puts MyClass.class_method
util_obj = AnotherClass.new
puts util_obj.utility_method

访问控制:public(默认),protected,private(应用于其下定义的方法)。

begin
# 可能会抛出异常的代码
result = 10 / 0
rescue ZeroDivisionError => e
puts "错误: #{e.message}"
rescue SomeOtherError => e
puts "另一种类型的错误: #{e.message}"
else
# 如果没有抛出异常则执行
puts "没有错误!结果: #{result}"
ensure
# 无论是否发生异常都始终执行
puts "正在清理..."
end

抛出异常:raise "我的自定义错误" 或 raise ArgumentError, "无效参数"。

选项描述
-c仅检查语法,不执行。
-e 'program'将给定的字符串作为程序执行。
-r library执行前需要加载库。
-w启用详细警告。
-v or --version显示 Ruby 版本。
--help显示帮助信息。
变量描述
RUBYLIBRuby 搜索库的路径(增强 $LOAD_PATH)。
RUBYOPT隐式传递给 Ruby 的命令行选项。
GEM_HOMEgems 安装的目录。
GEM_PATHRubyGems 查找 gems 的路径。

本快速指南涵盖了 Ruby 的许多基本方面。为了更深入的理解,请参考全面的 Ruby 书籍和官方 Ruby 文档。