如何在Jekyll/Liquid中实现(A and B) or (not C)及咨询运算规则
目标逻辑的Liquid实现方式
Liquid 没有采用C、JS体系下的符号逻辑运算符(如&&、||、!),全部使用英文关键字作为逻辑判断符,你提到的(A and B) or (not C)逻辑可以直接带括号书写,不需要做语法转换:
{% if (A and B) or (not C) %} 满足判断条件时渲染的内容 {% endif %}
实际项目中的使用示例:将A/B/C替换为真实的站点或页面变量,例如:
{% if page.show_notice and site.features.enable_notice or not site.maintenance_mode %} 渲染站点公共通知 {% endif %}
Liquid 运算符全局规则
优先级规范
所有运算符按照优先级从高到低排序,优先级越高的子表达式会被优先计算,默认优先级下完全不需要考虑书写顺序的影响:
- 最高级:圆括号
(),可完全覆盖默认优先级,强制调整任意运算顺序 - 一元运算符:
not(逻辑非),所有一元运算符的优先级都高于二元运算符 - 算术运算符:
*、/、%(取模) - 算术运算符:
+、- - 比较运算符:
>、>=、<、<= - 比较运算符:
==、!=、contains - 二元逻辑运算符:
and - 最低级:二元逻辑运算符
or
高频踩坑点:
and的优先级高于or,如果不加括号直接写if A or B and C,实际运算逻辑不是新手直觉里从左到右计算的(A or B) and C,而是等价于A or (B and C),和预期逻辑偏差极大。
结合方向规范
- 除一元运算符
not为右结合外,其余所有二元运算符(覆盖逻辑类、比较类、算术类)全部为左结合,即同级运算从表达式最左端开始,依次向右计算 - 左结合的实际影响:例如同优先级连续比较表达式
A > B < C == D,计算流程是先算最左侧的A > B得到布尔结果,再将该结果和C做<比较,最后将新的布尔结果和D做==判断 - 右结合的实际影响:由于
not是右结合,连续取反的表达式not not A会从最右侧开始计算,先算not A得到布尔值,再对该值取反,等价于not (not A)
内容的提问来源于stack exchange,提问作者jpc
相关产品推荐
相关产品推荐

