如何在简易MediaWiki模板中程序化分配变量?
解决方案
标准MediaWiki原生支持情况
标准MediaWiki(无额外扩展)不支持直接创建或修改临时变量。ParserFunctions仅提供逻辑判断、字符串处理和简单运算能力,没有变量赋值的语法,没法直接把计算结果存成临时变量复用。
替代方案1:ParserFunctions嵌套赋值技巧
虽然没有直接的变量赋值,但可以通过#ifeq、#switch等函数结合空值判断,实现类似“临时存储”的效果——本质是利用函数返回值传递结果,而非真正的变量。
举个BMI计算复用的例子:
{{#ifeq: {{#expr: {{{weight|0}}} / ({{{height|0}}}/100)^2 }} | {{#var: bmi}} | <!-- 复用BMI结果的逻辑 --> {{#expr: {{#var: bmi}} * 1.2 }} | <!-- 首次计算并传递结果 --> {{#expr: {{{weight|0}}} / ({{{height|0}}}/100)^2 }} }}
这种方式可读性一般,仅适合简单场景。
替代方案2:优化子模板传参
你已经尝试把公式移到子模板但传参太长,可以通过两种方式简化:
- 子模板使用和主模板一致的参数名,调用时直接传递对应参数,比如
{{CalculateWeight|height={{{height|}}}|weight={{{weight|}}}|sex={{{sex|}}}}},虽然仍需写参数,但编辑器的模板自动补全功能能减少重复输入。 - 把多个参数打包成字符串传递,子模板内拆分。比如主模板里写:
{{CalculateWeight|params={{{height|}}},{{{weight|}}},{{{sex|}}}}}
子模板CalculateWeight用#explode拆分参数:
{{#expr: {{#explode: {{{params|}}}|,|1}} / ({{#explode: {{{params|}}}|,|0}}/100)^2 }}
这种方式能减少传参行数,但需要处理拆分逻辑,适合参数较多的场景。
关于Variables扩展
虽然有说法称Variables扩展被弃用,但截至2024年它仍是MediaWiki官方维护的扩展,只是复杂场景下可能有性能问题。如果你的维基是自行管理的,安装这个扩展是最直接的解决方案——它允许用{{#set: X=计算结果}}创建临时变量,用{{#get: X}}调用,完全匹配你的需求。若担心弃用风险,可关注官方扩展更新日志,目前无明确移除计划。
内容的提问来源于stack exchange,提问作者user182238
相关产品推荐
相关产品推荐

