为什么 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
在试用 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