为什么Nix lambdas和?操作员是这样互动的吗?

为什么Nix lambdas和?操作员是这样互动的吗?,nix,nixos,Nix,Nixos,尝试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 ? "fir

尝试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
欢迎使用Nix 2.3.6版。类型:?寻求帮助。
nix repl>pkgs=import{}
nix repl>builtins.typeOf pkg
“设置”
nix repl>pkgs?“firefox”
真的
nix repl>func=(n:pkgs?“firefox”)
nix repl>func null
真的
nix repl>func=(n:pkgs?n)
nix repl>func“firefox”
假的
我假设
func“firefox”
将返回
true


什么样的Nix范例或概念解释了为什么在本例中
func“firefox”
返回
false

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

当Nix计算
a时?B,NIX只查看名称“B”,它不考虑“B”是否是本地上下文中的变量。那么
pkgs?如果仅当pkgs
是一个具有字面上命名为“n”的成员的集合,则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
nix repl>pkgs=import{}
nix repl>pkgs?“firefox”
真的
nix repl>pkgs?“姓名”
假的
nix repl>name=“firefox”
nix repl>pkgs?名称
假的
nix repl>firefox=“name”
nix repl>pkgs?火狐
真的
nix repl>pkgs?“${name}”
真的
nix repl>builtins.hasAttr名称包
真的

如果我理解正确,您的第三个示例显示的是
pkgs?firefox和pkgs?“firefox”和builtins.hasAttr“firefox”pkg都是等效的吗?