如何在 Nix 中将多个属性集的值设置为相同?
How to set multiple attribute sets' values to the same in Nix?
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 语法。如何在不提取新变量的情况下执行等效操作?
假设 realtime
和 wireshark
是另一个属性集中的键,您可以使用 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"];
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 语法。如何在不提取新变量的情况下执行等效操作?
假设 realtime
和 wireshark
是另一个属性集中的键,您可以使用 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"];