Nix表达式中`!a ? b`(属性集相关布尔操作)的含义是什么?
Nix 语言中问号运算符的两种用法说明
你遇到的是 Nix 语言中 ? 符号的两种完全独立的语法规则,二者作用没有关联:
- 函数参数属性集匹配场景的
?:作用和你理解的一致,用于为指定属性设置默认 fallback 值。示例中a ? null的含义是:如果调用函数时传入的属性集没有显式提供a属性,就自动将当前作用域内的a变量赋值为null。 - 独立运算符场景的
?:这是 Nix 内置的属性存在性检查运算符,语法为<属性集变量> ? <属性名>,返回布尔值,代表该属性集是否显式包含对应属性,判断逻辑和参数默认值完全无关,只取决于调用时有没有主动传入对应属性。
你疑惑的 !args ? a 表达式,实际是因为 Nix 中 ? 运算符的优先级高于布尔非运算符 !,运算顺序等价于 ! (args ? a):先检查 args 属性集里有没有显式传入 a 属性得到布尔结果,再对这个布尔结果取反,完全不存在对属性集本身取布尔否定的操作。
两种调用场景的差异示例:
- 调用函数时不传
a:此时a变量的值为默认的null,但args ? a返回false,!args ? a返回true,执行if分支逻辑 - 调用函数时显式传入
a = null:此时a变量的值还是null,但args ? a返回true,!args ? a返回false,执行else分支逻辑
你贴出的完整代码的语法解释如下:
# 函数入参为属性集:a 默认值为 null,b 默认值为27,其余未匹配的属性全部收集到 args 变量中 { a ? null , b ? 27 , ... }@args: # 判断逻辑:如果 args 没有显式传入 a 属性 if !args ? a then # 对应分支逻辑 else # 对应分支逻辑
内容的提问来源于stack exchange,提问作者toraritte
相关产品推荐
相关产品推荐

