要调用使用集合解构的 Nix 函数,您需要向其传递一个集合exactly它需要的键不多也不少:
nix-repl> ({ a }: a) { a = 4; b = 5; }
error: anonymous function at (string):1:2 called with unexpected argument ‘b’, at (string):1:1
例外情况是函数的参数列表末尾包含省略号:
nix-repl> ({ a, ... }: a) { a = 4; b = 5; }
4
然而,大多数包nixpkgs由一个default.nix
包含函数的文件是not用这个省略号定义。然而,不知怎的,当你使用callPackage
,它设法调用这些函数并仅向它们传递它们需要的参数。这是如何实施的?
有一个反射primop,可以解构函数参数:
nix-repl> __functionArgs ( { x ? 1, y }: x )
{ x = true; y = false; }
callPackage然后迭代这些属性名称,获取所需的包并构造包的 attrset,稍后将其提供给被调用的函数。
这是一个简单的例子:
nix-repl> callWithExtraArgs = f: args:
let
args' = __intersectAttrs (__functionArgs f) args;
in
f args'
nix-repl> callWithExtraArgs ({ x }: x + 1) { x = 4; y = 7; }
5
要浏览 Nix primops,请访问15.5。内置功能 in the 尼克斯手册(或参见不稳定分支的文档).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)