如何在 Nix 中将多个属性集的值设置为相同?

How to set multiple attribute sets' values to the same in Nix?

我有 the following code:

extraGroups = {
  realtime.members = [ config.users.users.default.name ];
  wireshark.members = [ config.users.users.default.name ];
}

理想情况下,我只需将内部部分缩短为以下内容之一:

realtime.members = wireshark.members = [ config.users.users.default.name ];
{realtime, wireshark}.members = [ config.users.users.default.name ];
map (entry: entry.members = [ config.users.users.default.name ]) [realtime, wireshark]
其中

None 是有效的 Nix 语法。如何在不提取新变量的情况下执行等效操作?

假设 realtimewireshark 是另一个属性集中的键,您可以使用 builtins.mapAttrs:

let 
  f = (n: v: v // {members = [configure.users.users.default.name]};
in builtins.mapAttrs f yourSet

例如,

nix-repl> f = n: v: v // {members = [1];}

nix-repl> :p builtins.mapAttrs f { realtime = {}; wireshare = {}; }
{ realtime = { members = [ 1 ]; }; wireshare = { members = [ 1 ]; }; }

该语言不支持此类语法,因为该功能已被其他语言功能(如 let 绑定)所涵盖。节省几次击键不值得一门复杂的语言,尤其是对于大多数人不应该经常编写的语言。

但是,您可以根据自己的具体情况执行此操作:

users.users.default.extraGroups = ["realtime" "wireshark"];