Эти ограничения вытекают из требования о прекращении оценки атрибута.
Предположим, вы хотите переопределить пакет hello
.Чтобы сослаться на старое определение пакета, вам нужно использовать super.hello
, потому что этот атрибут может быть оценен без оценки вашего определения hello
в оверлее.Если вместо этого вы будете ссылаться на self.hello
, это означает, что для оценки конечного атрибута hello
, Nix должен будет оценить self.hello
, который ссылается на конечный атрибут hello
, который ссылается на self.hello
, и так далее, создаваябесконечная рекурсия.
self
на самом деле может использоваться для ссылки на функции, но конвенция, похоже, вместо этого использует super
.Идея о том, что следующий оверлей может обезболить функцию lib.head
, не очень заманчива, хотя с помощью super
то же самое можно сделать и в предыдущем оверлее.
Вы также можете проверить это отличная презентация NixCon 2017 от Николаса .Он одновременно представляет концепцию и объясняет, как вы можете использовать ее наилучшим образом.