Ruby 快速指南
Ruby 快速参考指南
Section titled “Ruby 快速参考指南”本指南提供了 Ruby 核心概念和语法元素的简明概述,并根据现代 Ruby 实践进行了更新。
什么是 Ruby?
Section titled “什么是 Ruby?”Ruby 是一种动态的、开源的编程语言,专注于简洁和生产力。它拥有优雅的语法,易于阅读和编写。Ruby 由日本的 Yukihiro “Matz” Matsumoto 在 20 世纪 90 年代中期创建,是一种纯粹的面向对象语言,其中一切都是对象。
IRB(交互式 Ruby Shell):
Section titled “IRB(交互式 Ruby Shell):”irb 是 Ruby 的交互式 shell(REPL)。它允许你执行 Ruby 代码片段并立即查看结果,非常适合实验和学习。只需在终端中输入 irb 即可启动。
- 空白符: 通常被忽略,除非在字符串字面量中。缩进是为了可读性。
- 行结束符: 换行通常表示语句结束。分号(
;)可用于在一行中分隔多个语句,但很少使用。 - 标识符: 变量、方法等的名称。大小写敏感。约定:变量/方法使用
snake_case,类/模块使用CamelCase,常量使用UPPER_SNAKE_CASE。 - 注释: 单行注释以
#开头。多行注释以=begin和=end(各占一行)包围。
保留字(关键字):
Section titled “保留字(关键字):”具有特殊含义的词,例如 if、else、while、class、def、module、end、true、false、nil。(请参阅语法章节以获取更完整的列表)。
Here 文档(Heredocs):
Section titled “Here 文档(Heredocs):”用于创建多行字符串。常见的有 <<DELIMITER、<<'DELIMITER'(不插值)和 <<~DELIMITER(波浪线 heredoc,移除前导空白符)。
name = "Alice"message = <<~TEXT Hello, #{name}! Welcome to the system.TEXTputs message基本数据类型:
Section titled “基本数据类型:”数字:
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)。
变量类型和作用域:
Section titled “变量类型和作用域:”- 局部变量:
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 变量及其安全级别很大程度上是历史遗留的,不被视为现代应用程序的强大安全机制。请依赖其他的安全实践。
选定的预定义常量:
Section titled “选定的预定义常量:”| 常量 | 描述 |
|---|---|
TRUE, FALSE, NIL | true, false, nil 的已弃用大写版本。避免使用。 |
ARGF | 用于从 ARGV 中的文件或 STDIN 读取的流。 |
ARGV | 命令行参数数组。 |
ENV | 类似哈希的方式访问环境变量。 |
RUBY_VERSION | 包含当前 Ruby 版本的字符串(例如,“3.2.2”)。 |
RUBY_PLATFORM | 标识解释器平台的字符串。 |
STDIN, STDOUT, STDERR | 标准 I/O 流。 |
正则表达式(Regex):
Section titled “正则表达式(Regex):”字面量:/pattern/,%r{pattern}。选项:i(忽略大小写),m(多行 - . 匹配换行符),x(扩展 - 忽略空白符,允许注释)。
Example: `name = "John Doe"; if name =~ /john/i then puts "Match found!" end`文件 I/O:
Section titled “文件 I/O:”最佳实践是使用带块的 File.open,以确保文件自动关闭。
File.open("my_file.txt", "r") do |file| file.each_line do |line| puts line endend
File.write("output.txt", "Hello from Ruby!") # 写文件的简单方法模式:"r"(读),"w"(写,截断),"a"(追加),"r+"(读写)等。
运算符和优先级(简化):
Section titled “运算符和优先级(简化):”Ruby 有一套丰富的运算符,其中大部分是方法。优先级(从高到低,简化):
::,.(访问)[](元素访问),**(幂)!,~, 一元+,-(非, 按位非, 一元正/负)*,/,%(乘, 除, 模)+,-(加, 减)<<,>>(按位移位)&(按位与)|,^(按位或, 按位异或)>,>=,<,<=(比较)<=>,==,===,!=,=,!(相等性, 模式匹配)&&(逻辑与)||(逻辑或)..,…(范围创建)- 三元运算符:
? : - 赋值:
=,+=,-=, 等。 not(逻辑非, 优先级较低)and,or(逻辑与/或, 优先级较低)
不确定时,使用括号 () 来明确顺序或强制优先级。
if condition ... elsif condition ... else ... endunless condition ... else ... end(如果条件为假则执行)- 后缀
if/unless:statement if condition case expression when value ... else ... endwhile condition ... enduntil condition ... end- 迭代器(集合首选):
collection.each { |item| ... },n.times { ... },collection.map { ... } for item in collection ... end(不如each常用)- 循环控制:
break(退出循环),next(跳到下一次迭代),redo(重新开始当前迭代),retry(主要在rescue块中用于重新开始begin块)。
定义类和模块:
Section titled “定义类和模块:”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." endend
module MyModule def utility_method "这是一个实用方法。" endend
class AnotherClass include MyModule # 混入 MyModule 的实例方法end
obj = MyClass.new("RubyDev")puts obj.greetputs MyClass.class_method
util_obj = AnotherClass.newputs util_obj.utility_method访问控制:public(默认),protected,private(应用于其下定义的方法)。
begin # 可能会抛出异常的代码 result = 10 / 0rescue ZeroDivisionError => e puts "错误: #{e.message}"rescue SomeOtherError => e puts "另一种类型的错误: #{e.message}"else # 如果没有抛出异常则执行 puts "没有错误!结果: #{result}"ensure # 无论是否发生异常都始终执行 puts "正在清理..."end抛出异常:raise "我的自定义错误" 或 raise ArgumentError, "无效参数"。
Ruby 命令行选项(常用):
Section titled “Ruby 命令行选项(常用):”| 选项 | 描述 |
|---|---|
-c | 仅检查语法,不执行。 |
-e 'program' | 将给定的字符串作为程序执行。 |
-r library | 执行前需要加载库。 |
-w | 启用详细警告。 |
-v or --version | 显示 Ruby 版本。 |
--help | 显示帮助信息。 |
环境变量(常用):
Section titled “环境变量(常用):”| 变量 | 描述 |
|---|---|
RUBYLIB | Ruby 搜索库的路径(增强 $LOAD_PATH)。 |
RUBYOPT | 隐式传递给 Ruby 的命令行选项。 |
GEM_HOME | gems 安装的目录。 |
GEM_PATH | RubyGems 查找 gems 的路径。 |
本快速指南涵盖了 Ruby 的许多基本方面。为了更深入的理解,请参考全面的 Ruby 书籍和官方 Ruby 文档。