运算符总览
算术运算符
算术运算符用于数值计算,同时也支持部分字符串、集合等运行时扩展的实现:
幂运算符
^ 具有右结合性,即 2^3^2 会被解析为 2^(3^2) = 2^9 = 512,而不是 (2^3)^2 = 64。
比较运算符
比较运算符返回布尔结果,可用于条件与分支:类型检查运算符 is
is 运算符用于运行时类型检查,返回布尔值:
- 形式:
<expr> is <TypeName> - 右侧必须是类型字面量,不能是表达式
- 类型在解析期解析并缓存,运行时直接进行类型检查
使用完全限定类名:
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 运算符配合,提供默认值:赋值的结合方向
赋值语句通常按从左到右依次执行更新,更推荐拆成多行,而不是写成链式形式:与上下文调用、函数调用的组合
上下文调用运算符:: 与函数调用优先级较高,它们在解析时会先于算术与逻辑运算生效:
- 先对
&list做上下文调用,得到filter(fn)的结果。 - 再在该结果上做第二次
:: size()调用。 - 对
size()的返回值与0做比较。 - 最后与
&enabled做&&运算。
推荐写法
- 对于复杂表达式,宁可 多写括号 来表达意图,而不是依赖读者记住所有优先级规则。
- 在涉及
&&/||与函数调用、上下文调用混用时,建议按 “每行一个逻辑步骤” 的方式拆分。 - 对赋值表达式的值有依赖时,推荐显式拆出中间变量,有助于调试和日志记录。