--- title: 进阶Molang toc_max_level: 2 mentions: - Ciosciaa - TheItsNameless --- # 进阶Molang ## 值类型 - 所有Molang表达式都会返回一个值以便进行相等性检查。大多数表达式返回`0`。特别地,赋值表达式会返回被赋予的值,循环语句会返回循环体内最后一个解析的值(如果存在)。 - Molang中的所有值本质上都是单精度浮点数。 - `this`用于指代当前字段在运算过程中累积的当前值。目前仅在动画系统中被观察到可用,但可能在其他场景也有用途。例如,如果骨骼在`x`轴上的缩放变换累积结果为`62`,那么最终动画中`x`轴的`scale`设置为`-this`时,结果将为`-62`,这会抵消之前的变换效果。这一特性在大量原版动画中都有应用。在非动画上下文中,`this`似乎始终解析为`0`。 ### 布尔值 - 布尔值可在Molang中使用。`true`解析为`1`,`false`解析为`0`。 ### 数值 - 可以在数值前添加前导零(例如`0012`),以便在代码中对齐。 - 数值支持科学计数法(如`2.5e2`等价于250)。指数部分可使用`+`或`-`符号。 - 数值可以后缀单个`f`(常见于原版代码中用于标记浮点数),但目前未发现该符号具有实际功能影响。 ### 字符串 - 字符串使用`\`(JSON转义后为`\\`)作为某种转义符或其他功能。其具体功能尚不明确。已知后续两个字符会被传递给独立子解析器,但该子解析器遇到结束单引号`'`时无法正确退出。例如Molang字符串`"v.type = '\\x';"`是无效的。而单独存在的`'`通常会被视为字符串结束符,但在`\`后的两个字符中出现时会被允许。 - 字符串值(多数情况下)以浮点数形式进行增量表示。可以通过等式或比较运算符对单字符字符串进行比较,甚至可对单字符字符串内容进行"调整"。多字符字符串在此类操作中的行为尚不明确。 ## 运算符 运算符优先级列表(从高到低): 1. `()` 和 `[]` 2. `->` 3. `!` 和 `-`(一元取反) 4. `*` 和 `/` 5. `+` 和 `-`(二元减法) 6. `<`, `<=`, `>` 和 `>=` 7. `==` 和 `!=` 8. `&&` 9. `||` 10. `?` 和 `? :` 11. `??` 12. `=` 13. `return` - 除条件运算符外,所有运算符均按从左到右顺序执行。 - 同一语句中不可重复使用`->`运算符。 - 逻辑运算符具有短路特性。 ## 语句 - 赋值语句会返回被赋予的值。因此可以进行链式赋值(例如`v.iterator_x = (v.iterator_z = math.random_integer(16, 32));`)。 - 大括号作用域内的最后一条语句无需以`;`结尾。 - 大括号作用域可以在任何表达式可用的位置使用。例如`v.spawn_point ?? {v.target = false;};`会在`v.spawn_point`未定义时将`v.target`设为`false`。 ## 集合类型 - 实体可迭代对象(如`q.get_nearby_entities`的结果)属于独立"类型",不可与下标运算符兼容使用。 - 数组类型同样无法与实体可迭代操作(如`q.count`)兼容使用。 - 数组下标结果不可直接作为`+`, `-`, `*`, `/`的操作数,但可作为函数参数(包括数学函数)或与其他运算符配合使用。 ## 表达式求值 - `initialize`和`pre_animation`数组中的语句采用延迟连接方式。这些数组中的每个Molang字符串必须独立语法有效,同时所有字符串连接后也需构成有效的Molang输入。 ## 限制条件 - 除数值大小外,未发现Molang存在合理的功能限制。在极端场景下仍可观察到循环计数、字符串长度、输入长度、集合大小等参数的正常运行。