8

要调用使用集合解构的 Nix 函数,您需要向它传递一个具有所需键的集合不多也不少:

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文件包含一个使用此省略号定义的函数。然而,不知何故,当您使用 时callPackage,它设法调用这些函数并仅将它们需要的参数传递给它们。这是如何实施的?

4

1 回答 1

7

有一个反射primop,可以解构函数参数:

nix-repl> __functionArgs ( { x ? 1, y }: x )
{ x = true; y = false; }

callPackage然后遍历这些属性名称,获取所需的包并构造包的属性集,稍后将其提供给被调用的函数。

这是一个简单的例子:

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。Nix 手册中的内置函数(或查看不稳定分支的文档)。

于 2017-09-06T22:26:00.783 回答