Skip to content

Ruby 语法

让我们从一个最小的 Ruby 程序开始。Ruby 文件通常使用 .rb 扩展名。

#!/usr/bin/env ruby
# 上面这行是 'shebang',在类 Unix 系统中很常见,用于指定解释器。
# -w 启用警告,这是开发过程中的良好实践。
puts "Hello, Ruby!"

要运行它,请将其保存为 hello.rb 并在终端中执行:

$ ruby hello.rb

这将输出:

Hello, Ruby!

现在,让我们探讨一些基本的语法概念:

空白符(空格、制表符)通常会被忽略,除非在字符串字面量内或用于消除歧义。一致的缩进对于可读性至关重要,但语法上解释器本身并不强制要求(尽管像 RuboCop 这样的风格指南会强制执行)。

Ruby 将分号(;)和换行符解释为语句的结束。如果每个语句都在自己的行上,则很少需要分号。要将语句延续到下一行,请在当前行末尾使用运算符(如 +、-)或反斜杠(“)。

a = 1 + 2 + \
3 # 使用反斜杠延续语句
puts a # 输出:6
b = 10 +
5 # 由于以运算符结尾而延续语句
puts b # 输出:15

标识符是变量、常量、方法、类和模块的名称。Ruby 标识符是大小写敏感的(例如,name 和 Name 是不同的)。它们通常由字母数字字符和下划线(_)组成。

常见的命名约定:

  • 局部变量和方法名: snake_case(例如,user_name,calculate_total)。
  • 实例变量: @snake_case(例如,@user_name)。
  • 类变量: @@snake_case(例如,@@instance_count)。
  • 全局变量: $snake_case 或 $kebab-case(例如,$debug_mode)。谨慎使用。
  • 常量: UPPER_SNAKE_CASE(例如,MAX_USERS,PI)。
  • 类名和模块名: CamelCase(例如,UserServic,HttpUtils)。

方法名可以以 ? 结尾(约定俗成地用于返回布尔值的方法,例如 empty?)或以 ! 结尾(约定俗成地用于修改其接收者或具有更危险/令人惊讶效果的方法,例如 sort!)。

这些词在 Ruby 中具有特殊含义,不能用作变量名或常量名。但是,它们有时可以用作方法名。

关键字组 1关键字组 2关键字组 3关键字组 4
BEGINENDaliasand
beginbreakcaseclass
defdefined?doelse
elsifendensurefalse
forifinmodule
nextnilnotor
redorescueretryreturn
selfsuperthentrue
undefunlessuntilwhen
whileyield__FILE____LINE__
__ENCODING__

此列表具有代表性。有关权威列表,请查阅官方 Ruby 文档。

Heredocs 是一种创建多行字符串的便捷方式。它们以 << 后跟一个分隔符开头。当分隔符再次单独出现在一行时,字符串结束。

标准 Heredoc (<<DELIMITER): 插值和转义序列会被处理。

name = "World"
standard_heredoc = <<MESSAGE
Hello, #{name}!
This is a multi-line string.
Indentation is preserved.
MESSAGE
puts standard_heredoc

非插值 Heredoc (<<'DELIMITER'): 不处理插值或转义序列。

non_interpolating_heredoc = <<'TEXT'
This will print literally: #{name}\n.
TEXT
puts non_interpolating_heredoc

波浪线 Heredoc (<<~DELIMITER): 这非常有用。它允许你在源代码中缩进 Heredoc 内容以提高可读性,并且会自动移除每行前导的空白符,直到最少缩进的行或结束分隔符的级别。

def get_message
user = "Alice"
squiggly_heredoc = <<~GREETING
Hello, #{user}.
Welcome to our application!
We hope you enjoy your stay.
GREETING
# 'We hope' 行将有 2 个空格缩进,GREETING 将有 0 个。
end
puts get_message

用于命令执行的 Heredoc (<<DELIMITER“): 内容会作为 shell 命令执行。

command_output = <<`CMD`
echo Listing files:
ls -lah
CMD
puts command_output

结束分隔符必须在其行的开头,可选地后跟一个分号。<<(或 <<~、<<-)和分隔符之间不应有空格。

Ruby 允许你定义在特定时间执行的代码块:

  • BEGIN { code }:BEGIN 块内的代码在脚本中任何其他代码运行之前执行一次。
  • END { code }:END 块内的代码在程序终止之前执行(包括异常处理期间),在所有其他代码运行后。
#!/usr/bin/ruby
puts "这是主 Ruby 程序。"
BEGIN {
puts "正在初始化 Ruby 程序... (BEGIN 块)"
}
END {
puts "正在终止 Ruby 程序... (END 块)"
}

输出:

正在初始化 Ruby 程序... (BEGIN 块)
这是主 Ruby 程序。
正在终止 Ruby 程序... (END 块)

BEGIN 和 END 块在现代应用程序代码中不太常见,但在脚本或特定库场景中用于设置/清理可能有用。

注释会被 Ruby 解释器忽略,用于解释代码。

  • 单行注释: 以 #(井号)字符开头,并延伸到行尾。
  • 多行(块)注释: 以 =begin 开头,其后独占一行,以 =end 结尾,其前独占一行。这两个标记之间的所有内容都是注释。它们必须分别在其行的最开头。
# 这是一个单行注释。
x = 10 # 这是语句后的注释。
=begin
这是一个多行注释。
它可以跨越多行。
对于临时禁用大块代码很有用。
=end
puts "多行注释后的代码。"

理解这些基本语法规则是编写有效的 Ruby 程序的第一步。