为什么 Nix lambda 和 ? 运算符会这样交互?



在尝试nix和nix repl时:

Welcome to Nix version 2.3.6. Type :? for help.
nix-repl> pkgs = import <nixpkgs> {}
nix-repl> builtins.typeOf pkgs
"set"
nix-repl> pkgs ? "firefox"
true
nix-repl> func = (n: pkgs ? "firefox")
nix-repl> func null
true
nix-repl> func = (n: pkgs ? n)
nix-repl> func "firefox"
false

我以为func "firefox"true回来.

哪些 Nix 范式或概念解释了为什么func "firefox"在此示例中返回false

你在?之后写的东西不是一个表达式:它是一个属性路径。 这使您可以执行功能强大的操作,例如pkgs ? hello.src探测以查看pkgs是否具有名为hello的属性,该属性具有名为src的属性。

当 Nix 计算a ? b时,Nix 只看名称 "b",它不考虑 "b" 是否是局部上下文中的变量。 因此,如果 a 仅当pkgs是一个集合,其成员字面上名为"n",则pkgs ? n为真。

下面是探讨该问题的示例 repl 会话。 最后一行显示了我认为您正在尝试做的事情的可能解决方案。

nix-repl> pkgs = import <nixpkgs> {}
nix-repl> pkgs ? "firefox"
true
nix-repl> pkgs ? "name"
false
nix-repl> name = "firefox"
nix-repl> pkgs ? name
false
nix-repl> firefox = "name"
nix-repl> pkgs ? firefox
true
nix-repl> pkgs ? "${name}"
true
nix-repl> builtins.hasAttr name pkgs  
true

最新更新