Skip to content

Conversation

@clsty
Copy link
Contributor

@clsty clsty commented Sep 24, 2025

此为应 @ryan4yin 邀请大幅修改 Nix 语言快速入门工程的第二部分,范围是 递归属性集 一节。

本次重写发现原教程存在很有迷惑性的事实错误,在原教程中给了一个例子

rec {
  one = 1;
  two = one + 1;  # 直接依赖于 one
  three = two + 1; # 直接依赖于 two,间接依赖于 one
}

其结果为

{ one = 1; three = 3; two = 2; }

原教程借此说明

元素的声明顺序并不决定元素在属性集中的排布顺序,属性集中的元素排布顺序是由求值顺序决定的,优先被求值的被放在了前面。

我之前看这段的时候极其迷惑,怎么也无法理解 three 为什么会比 two 更先求值。直到我把两处 one 一起换成 zne

rec {
  zne = 1;
  two = zne + 1;  # 直接依赖于 one
  three = two + 1; # 直接依赖于 two,间接依赖于 one
}

看到下面的结果

{
  three = 3;
  two = 2;
  zne = 1;
}

而茅塞顿开的时候,真的想问问原教程的作者是出于什么心理,脑补出了“优先被求值的被放在了前面”这种跟自己的例子都对不上的奇怪结论。所幸本 PR 合并之后,读者就能免于像我一样被怎么也想不通的这个地方折磨了。

@linyinfeng
Copy link
Member

实际上在 cppnix 里 attribute set 用的是 std::map 来着,而 std::map 的 key 是有序的。

@ryan4yin ryan4yin merged commit b7f2130 into NixOS-CN:main Sep 24, 2025
@clsty clsty changed the title 大修Nix语言快速入门(第二部分) 大修 Nix 语言快速入门(第二部分) Oct 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants