Ruby 基础语法
环境装好后,我们来系统过一遍 Ruby 的基础语法。这一章不涉及复杂概念,只讲程序"长什么样"——结构、注释、关键字、命名约定。读完你就能看懂任何 Ruby 代码的大致框架。
1. Ruby 程序的基本结构
Ruby 比 C/Java 简单得多:不需要 package,不需要 main 函数,不需要类。文件第一行就能直接写代码:
# 一个最简单的 Ruby 程序
puts "Hello, Ruby!"
# 也可以定义方法,然后调用
def greet(name)
puts "你好, #{name}!"
end
greet("小明") # 输出: 你好, 小明!
greet "小红" # 括号可以省略,完全等价几个要点:
- 从上到下执行:Ruby 解释器从文件第一行开始,逐行执行。
- 不需要入口函数:不像 C/Java/Go 必须有 main,Ruby 没有"主函数"概念,直接写代码就跑。
- 方法用 def 定义:def 后面跟方法名和参数,以 end 结束。
- 没有分号:换行就是语句结束(一行写多条语句也可以加分号,但社区不推荐)。
2. 注释
Ruby 的注释规则简单:
# 单行注释:井号开头,到行尾结束
puts "代码" # 行尾也可以注释
=begin
这是多行注释(块注释)
用 =begin 和 =end 包裹
注意:等号必须顶格写,前面不能有空格
社区其实很少用,大家更倾向多个 #
=end
puts "块注释结束"实际项目里 几乎没人用 =begin/=end 块注释,大家都习惯用多个 #。块注释偶尔用来临时禁用一大段代码。
3. 方法调用可省略括号(重要!)
这是 Ruby 读起来像自然语言的核心原因之一。调用方法时括号可以省略:
# 括号能省,让代码读起来更像英文句子
puts("hello") # 标准写法
puts "hello" # 省略括号,更常用
# 但有参数优先级时,括号还是加上更清晰
puts (1 + 2) * 3 # 9
puts 1 + 2 * 3 # 7(乘法优先)
# 调用别人的方法时,如果一眼能看懂,就省括号
# Rails 里到处都是:
link_to "首页", root_path
render json: @users
redirect_to @post这条规则有副作用:有运算符优先级时,不加括号可能出错。原则是:一行代码无歧义就省,有歧义或参数复杂就加。看 Rails 代码你会发现,大家写得很随意,但读起来反而更顺。
4. 命名约定
Ruby 社区有非常强烈的命名共识,几乎所有项目都遵守:
# 命名约定:Ruby 社区有强烈的风格共识
# 1. 局部变量 / 方法名:蛇形命名(snake_case)
user_name = "小明"
def calculate_total
# ...
end
# 2. 类名 / 模块名:大驼峰(PascalCase)
class ShoppingCart
end
module UserAuth
end
# 3. 常量:尖叫蛇(SCREAMING_SNAKE_CASE)
MAX_RETRIES = 3
API_BASE_URL = "https://api.example.com"
# 4. 实例变量:前缀 @
@count = 0
# 5. 类变量:前缀 @@
@@total = 0
# 6. 全局变量:前缀 $(少用)
$app_name = "myapp"记住这套约定,你写出来的代码就是"地道"的 Ruby 风格。换种命名(比如 JS 的 camelCase 写变量)虽然能跑,但会被 RuboCop 风格检查器警告。
5. Ruby 的真假规则(踩坑点)
Ruby 的真假判断只有两个对象是假:nil 和 false。其他所有都是真——包括 0、空字符串、空数组。这跟 C、JS、Python 都不一样,新手容易踩坑:
# Ruby 的真假规则:只有 nil 和 false 是假,其他都是真
if 0 # 0 在 Ruby 里是真!(不像 C/JS)
puts "0 是真"
end
if "" # 空字符串也是真
puts "空字符串是真"
end
if [] # 空数组也是真
puts "空数组是真"
end
# 想判断"非空",用 present?(Rails 提供)或手动
# 想判断 nil,用 .nil? 方法所以判断"是否为零"用 n.zero?,判断"是否为空"用 .empty?,判断"是否为 nil"用 .nil?——不要靠 if 隐式判断。
6. Ruby 的关键字
Ruby 大约有 40 多个关键字,比 Go 多但比 Java 少。常用的分组:
- 定义:
defendclassmodulereturn - 控制流:
ifelsifelseunlesswhileuntilforbreaknextcasewhen - 块与方法:
doyieldbeginrescueensure - 模块与可见性:
requireincludepublicprivateprotected - 布尔/特殊值:
truefalsenilself - 异常处理:
raiseretry
7. 代码风格:RuboCop
Ruby 社区有官方风格指南(The Ruby Style Guide),配套工具 RuboCop 自动检查/格式化代码。它是 Ruby 版的 gofmt/prettier:
- 用两个空格缩进(不是 Tab,也不是 4 空格,这点和 Go 一样)。
- 行长建议不超过 120 字符。
- 操作符两边加空格:
a + b而不是a+b。 - 方法末尾不加括号,如果它没有参数;
def foo不是def foo()。
VS Code 装 RuboCop 插件后,保存时会自动修复大部分风格问题,跟着它学就对了。
8. 一个稍微完整的程序
把上面学的串起来,看一个稍微像样的 Ruby 程序:
# 一个最简单的 Ruby 程序
puts "Hello, Ruby!"
# 也可以定义方法,然后调用
def greet(name)
puts "你好, #{name}!"
end
greet("小明") # 输出: 你好, 小明!
greet "小红" # 括号可以省略,完全等价这就是 Ruby 程序的常见长相:直接写逻辑,用 def 定义方法,最后调用。没有冗余的样板。
小结
这一章你了解了 Ruby 程序的整体骨架:不需要 main 函数、不需要类、括号可省、有强烈的命名约定。还踩了一个真假规则的坑(0 是真)。下一篇我们看 Ruby 的变量——五种变量的作用域各不相同。
← 上一篇 Ruby 环境安装
下一篇 Ruby 变量 →