为什么 Nix lambdas 和 ? 操作员这样交互?

AMe*_*ars 3 nixos nix

在尝试 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
Run Code Online (Sandbox Code Playgroud)

我以为func "firefox"会返回true

什么 Nix 范式或概念解释了为什么在这个例子中func "firefox"返回false

Dav*_*son 6

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

Nix 求值时a ? b,Nix 只看名称“b”,它不考虑“b”是否是本地上下文中的变量。所以,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
Run Code Online (Sandbox Code Playgroud)