为什么 Nix lambdas 和 ?运营商这样互动?

Why do Nix lambdas and the ? operator interact like so?

在试用 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" 会 return true

什么 Nix 范例或概念解释了为什么在此示例中 func "firefox" returns false

您在 ? 之后写的不是表达式:它是属性路径。这允许你做一些强大的事情,比如 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