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
我有一个很好的方法可以将一个值直接反引用到一个集合中吗?
在 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