Ruby运算符优先级 #
一、优先级概述 #
运算符优先级决定了表达式中运算的顺序。优先级高的运算符先执行,优先级低的运算符后执行。
二、优先级表 #
从高到低排列:
| 优先级 | 运算符 | 描述 |
|---|---|---|
| 1 | :: | 作用域解析 |
| 2 | [] | 数组访问 |
| 2 | ** | 幂运算 |
| 3 | ! ~ + - | 非、取反、正、负(一元) |
| 4 | * / % | 乘、除、取余 |
| 5 | + - | 加、减 |
| 6 | << >> | 左移、右移 |
| 7 | & | 按位与 |
| 8 | | ^ | 按位或、异或 |
| 9 | > >= < <= | 大小比较 |
| 10 | <=> == === != =~ !~ | 相等比较 |
| 11 | && | 逻辑与 |
| 12 | || | 逻辑或 |
| 13 | … … | 范围 |
| 14 | ? : | 三元条件 |
| 15 | = %= /= -= += |= &= >>= <<= *= &&= ||= **= | 赋值 |
| 16 | not | 逻辑非 |
| 17 | and or | 逻辑与、或 |
三、常见优先级问题 #
3.1 算术运算 #
ruby
2 + 3 * 4
(2 + 3) * 4
10 - 4 / 2
(10 - 4) / 2
2 ** 3 ** 2
(2 ** 3) ** 2
3.2 逻辑运算 #
ruby
true || false && false
(true || false) && false
!true && false
!(true && false)
3.3 比较与逻辑 #
ruby
1 < 2 && 3 < 4
(1 < 2) && (3 < 4)
1 < 2 || 3 > 4 && 5 < 6
1 < 2 || ((3 > 4) && (5 < 6))
3.4 赋值与逻辑 #
ruby
a = true && false
a
a = true and false
a
b = false || true
b
b = false or true
b
四、&& vs and #
4.1 优先级差异 #
ruby
a = true && false
a = true and false
a = false || true
a = false or true
4.2 推荐用法 #
ruby
if a && b
do_something
end
save && redirect or render(:new)
result = operation or raise "失败"
五、|| vs or #
5.1 优先级差异 #
ruby
a = false || true
a = false or true
a = nil || "default"
a = nil or "default"
5.2 推荐用法 #
ruby
name = params[:name] || "Default"
result = operation or return
六、! vs not #
6.1 优先级差异 #
ruby
!true && false
not true && false
!false || true
not false || true
6.2 推荐用法 #
ruby
if !valid?
handle_error
end
unless valid?
handle_error
end
return not authorized?
七、范围运算符优先级 #
7.1 与逻辑运算 #
ruby
(1..5) === 3
1..5 === 3
if (1..5) === x
puts "in range"
end
7.2 与比较运算 #
ruby
x = 3
(1..5) === x
1..5 === x
八、三元运算符优先级 #
8.1 与逻辑运算 #
ruby
true ? 1 : 2
true && false ? 1 : 2
(true && false) ? 1 : 2
a = true ? 1 : 2
a = true ? 1 : 2 || 3
8.2 嵌套三元 #
ruby
score = 85
result = score >= 90 ? "A" : score >= 80 ? "B" : "C"
result = score >= 90 ? "A" : (score >= 80 ? "B" : "C")
九、方法调用优先级 #
9.1 方法调用与运算 #
ruby
def double(x)
x * 2
end
double 2 + 3
double(2 + 3)
double(2) + 3
9.2 链式调用 #
ruby
"hello".upcase.length
"hello".upcase + " world"
十、结合性 #
10.1 左结合 #
ruby
10 - 5 - 3
(10 - 5) - 3
100 / 10 / 2
(100 / 10) / 2
10.2 右结合 #
ruby
2 ** 3 ** 2
2 ** (3 ** 2)
a = b = c = 1
a = (b = (c = 1))
10.3 赋值运算符 #
ruby
a = b = 1
a = (b = 1)
a ||= b ||= 1
a ||= (b ||= 1)
十一、使用括号明确优先级 #
11.1 提高可读性 #
ruby
if (user.admin? || user.moderator?) && post.published?
allow_edit
end
result = (a + b) * (c - d)
11.2 避免歧义 #
ruby
a = b = c = []
a = (b = (c = []))
x = y || z && w
x = y || (z && w)
x = (y || z) && w
11.3 复杂表达式 #
ruby
if (a && b) || (c && d)
do_something
end
result = ((a + b) * c - d) / e
十二、实用示例 #
12.1 条件赋值 #
ruby
name = params[:name] || params[:nickname] || "Guest"
result = condition ? value1 : value2
value = a || b || c
12.2 链式比较 #
ruby
if (1..10) === x && x.even?
puts "偶数且在1-10之间"
end
if x > 0 && x < 100
puts "0 < x < 100"
end
12.3 复杂条件 #
ruby
def can_access?(user, resource)
(user.admin? || user.owner_of?(resource)) && resource.active?
end
def valid?(data)
data && !data.empty? && data.size > 0
end
12.4 安全导航 #
ruby
if user&.profile&.avatar&.url
puts user&.profile&.avatar&.url
end
url = user&.profile&.avatar&.url || "default.png"
十三、最佳实践 #
13.1 使用括号提高可读性 #
ruby
if (a && b) || (c && d)
do_something
end
13.2 && 和 || 用于布尔运算 #
ruby
if a && b
do_something
end
result = a || b
13.3 and 和 or 用于流程控制 #
ruby
save && redirect or render(:new)
copy_file or raise "复制失败"
13.4 分解复杂表达式 #
ruby
if (user.admin? || user.moderator?) && post.published? && !post.locked?
allow_edit
end
def can_edit?
(admin? || moderator?) && published? && !locked?
end
if can_edit?
allow_edit
end
十四、总结 #
本章我们学习了:
- 优先级表:从高到低的运算符顺序
- 常见问题:算术、逻辑、比较、赋值
- && vs and:优先级差异和使用场景
- || vs or:优先级差异和使用场景
- 结合性:左结合和右结合
- 括号使用:明确优先级、提高可读性
接下来让我们学习Ruby的控制流!
最后更新:2026-03-27