【问题标题】:Why do Nix lambdas and the ? operator interact like so?为什么 Nix lambdas 和 ?操作员是这样交互的吗?
【发布时间】:2021-01-31 04:14:54
【问题描述】:

在尝试 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" 会返回true

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

【问题讨论】:

    标签: nix nixos


    【解决方案1】:

    ? 后面写的不是表达式:它是属性路径。这允许您执行强大的操作,例如 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
    

    【讨论】:

    • 所以如果我理解正确的话,你的第三个例子显示pkgs ? firefoxpkgs ? "firefox",最后builtins.hasAttr "firefox" pkgs 都是等价的?
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-05-14
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多