要调用使用一套解构一个尼克斯的功能,你需要用它传递了一套正是它需要,没有更多的按键也不能少:
nix-repl> ({ a }: a) { a = 4; b = 5; }
error: anonymous function at (string):1:2 called with unexpected argument ‘b’, at (string):1:1
Run Code Online (Sandbox Code Playgroud)
例外情况是函数的参数列表末尾包含省略号:
nix-repl> ({ a, ... }: a) { a = 4; b = 5; }
4
Run Code Online (Sandbox Code Playgroud)
但是,nixpkgs中的大多数包都包含一个default.nix包含未使用此省略号定义的函数的文件.然而,不管怎样,当你使用时callPackage,它设法调用这些函数并仅传递它们所需的参数.这是如何实现的?
有一个反射primop,可以解构函数参数:
nix-repl> __functionArgs ( { x ? 1, y }: x )
{ x = true; y = false; }
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |