如何在Nix中实现集合的深度合并?
如何在Nix中实现集合的深度合并?
嘿,我完全懂你碰到的这个坑!Nix里默认的//运算符是浅合并,当遇到嵌套集合的时候,它会直接把左边集合里的整个嵌套字段替换成右边的,而不是逐个合并嵌套集合里的属性——这就是为什么你原来的代码里some_value_that_will_be_lost会丢失的原因。
你想要的是深度合并,也就是递归地处理每一层嵌套集合,只替换重复的属性,保留其他未冲突的属性。其实Nixpkgs的标准库已经有现成的函数能搞定这个:lib.recursiveUpdate。
把你的代码改成下面这样就行:
let lib = (import <nixpkgs> { }).pkgs.lib; set_one = { nested_set = { some_value_that_will_be_lost = "some forgotten value"; some_attribute = "some value"; }; }; set_two = { nested_set = { some_attribute = "some other value"; }; }; in lib.recursiveUpdate set_one set_two
运行这段代码后,得到的结果就是你期望的:
{ nested_set = { some_value_that_will_be_lost = "some forgotten value"; some_attribute = "some other value"; }; }
顺带说一句,你之前试的lib.modules.mergeModules其实是给NixOS模块系统设计的,用来处理模块的合并逻辑,对于普通集合的深度合并来说有点大材小用了,recursiveUpdate才是更直接、轻量的选择。而且它支持多层嵌套的集合合并,不管你的嵌套层级有多深,都会递归地帮你合并属性~
备注:内容来源于stack exchange,提问作者St-H
相关产品推荐
相关产品推荐

