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

十四、总结 #

本章我们学习了:

  1. 优先级表:从高到低的运算符顺序
  2. 常见问题:算术、逻辑、比较、赋值
  3. && vs and:优先级差异和使用场景
  4. || vs or:优先级差异和使用场景
  5. 结合性:左结合和右结合
  6. 括号使用:明确优先级、提高可读性

接下来让我们学习Ruby的控制流!

最后更新:2026-03-27