在尝试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