Nix:对集合的反引号

Nix: Antiquote to a Set

我有一个很好的方法可以将一个值直接反引用到一个集合中吗?

在 Nix 中,我们可以对 select 基于变量的属性使用反引号:

let 
  x = { a = "V" ; };
  sel = "a";  
in 
  x."${sel}"

result> "V"

但是,如果相反,我们想要 select 集 x,基于反引号怎么办?

let 
  x = { a = "V" ; };
  sel = "x";  
in
  "${sel}".a

result> (paraphrased) error: Expected a set but received a string.

Nix 抱怨它试图从集合中检索属性 a,但没有给它一个集合 (x),而是给它一个字符串 ("x") .我知道我们通常不希望将字符串 "x" 强制转换为范围内的值 x,但我觉得 Nix 在我们处理它的这种情况下不会这么做具体作为一套。但我离题了...

无论如何,如果能演示一个简单的模式来解决这个问题,我将不胜感激。或者,更好的是,一个可重用的结构,如 (toSet sel).a 按预期工作。谢谢!

如果我没理解错的话,你想用一个变量从当前作用域中选择另一个变量。 您使用的语法用于字符串插值,它只会 return 一个字符串。 据我所知,Nix 没有提供以这种方式动态访问作用域的方法。

我不希望实现这样的功能,因为这样的构造看起来很脆弱。将它添加到语言中将使语言更难推理,因为很难判断是否使用了变量,或者字符串插值是否实际上 return 是一个字符串。

最好将您可能希望 sel 指向的所有内容放在一个属性集中。这将使 reader.

清楚代码的意图
let
  selectables = {
    x = { a = "V"; };
    y = { a = "W"; };
  };
  selector = "x";
in
  selectables.${selector}.a   # the quotes weren't necessary