Skip to main content
运算符决定表达式的组合与求值顺序。本章汇总核心运算符,并说明它们的优先级与结合性,便于阅读复杂表达式。

运算符总览

算术运算符

算术运算符用于数值计算,同时也支持部分字符串、集合等运行时扩展的实现: 幂运算符 ^ 具有右结合性,即 2^3^2 会被解析为 2^(3^2) = 2^9 = 512,而不是 (2^3)^2 = 64

比较运算符

比较运算符返回布尔结果,可用于条件与分支:

类型检查运算符 is

is 运算符用于运行时类型检查,返回布尔值:
语法规则:
  • 形式:<expr> is <TypeName>
  • 右侧必须是类型字面量,不能是表达式
  • 类型在解析期解析并缓存,运行时直接进行类型检查
支持的类型别名(不区分大小写): 使用完全限定类名:
在 when 表达式中使用: is 运算符可以在 when 表达式中作为分支匹配条件:
详见 控制流 章节。

逻辑运算符

逻辑运算符使用“真值语义”而不是仅限布尔类型,内部会调用运行时的 isTrue 判定: 逻辑运算符具有短路行为:
  • a && b:当 a 为假时,不再计算 b
  • a || b:当 a 为真时,不再计算 b

赋值与复合赋值

赋值运算符用于更新变量的当前值,结合引用运算符 & 在表达式中读取结果:

特殊运算符

Fluxon 还提供若干与控制流和语义糖相关的运算符: 这些运算符在其他章节中有详细说明,本章主要关心它们在大表达式中的优先级关系。

运算符优先级

Fluxon 的表达式解析采用自顶向下递归下降和优先级划分。 括号 (...) 总是可以强制改变默认优先级:

一元运算符与引用

一元运算符写在操作数前面:
引用 (&) 的优先级高于大多数二元运算符,因此 &a + &b 会被解析为 (&a) + (&b),而不是 &(a + b) 如果需要对整个表达式结果取引用(在部分语法中),应显式添加括号。

逻辑短路与结合方向

逻辑运算符是 左结合 的:
短路行为配合左结合,使得从左到右依次检查条件成为自然写法:

Elvis 运算符

Elvis 运算符 ?: 用于在左侧为 null 时返回右侧默认值:
它的优先级低于算术、比较和逻辑运算,一般规则是:
  • 先计算 &input 的值。
  • 如果结果为 null,返回右侧表达式的值;否则返回左侧。
如需限定参与 ?: 的子表达式范围,可以使用括号:

安全访问运算符

Fluxon 提供两种安全访问运算符,用于处理可能为 null 的目标:

安全成员访问 ?.

当目标为 null 时返回 null,而不是抛出 NullPointerException

安全上下文调用 ?::

当目标为 null 时返回 null,而不是执行右侧的上下文表达式:

与 Elvis 组合

安全访问常与 Elvis 运算符配合,提供默认值:

赋值的结合方向

赋值语句通常按从左到右依次执行更新,更推荐拆成多行,而不是写成链式形式:
这样更利于阅读和调试,也避免对赋值结果是否可参与运算的误解。

与上下文调用、函数调用的组合

上下文调用运算符 :: 与函数调用优先级较高,它们在解析时会先于算术与逻辑运算生效:
大致解析为:
  1. 先对 &list 做上下文调用,得到 filter(fn) 的结果。
  2. 再在该结果上做第二次 :: size() 调用。
  3. size() 的返回值与 0 做比较。
  4. 最后与 &enabled&& 运算。
如需改变这一顺序,可以照常使用括号包裹需要整体计算的部分。

推荐写法

  • 对于复杂表达式,宁可 多写括号 来表达意图,而不是依赖读者记住所有优先级规则。
  • 在涉及 && / || 与函数调用、上下文调用混用时,建议按 “每行一个逻辑步骤” 的方式拆分。
  • 对赋值表达式的值有依赖时,推荐显式拆出中间变量,有助于调试和日志记录。

相关链接