在尝试 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?
你写的东西?不是一个表达式:它是一个属性路径。这使您可以执行强大的操作,例如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)
| 归档时间: |
|
| 查看次数: |
36 次 |
| 最近记录: |