在 range 中保留根点作用域
在循环中使用捕获的根引用
在 range 中保留根点作用域 是 CoddyKit 上的免费 Helm Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Helm Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Helm Academy 课程共包含 4 节课。
点号可以移动
在 range 循环内部,点号不再表示 Chart 根,而是指向当前项。这会让许多首次编写模板的人感到困惑。
为什么这是个问题
点号被重新绑定后,.Values 或 .Release 这样的表达式在循环内部就不再有效,因为根上下文不再是点号。
先捕获根上下文
解决方法很简单:在循环之前,将根点号保存到一个变量中。这样在 range 内部就可以通过该变量访问原始上下文。
{{ $root := . }}使用保存的根上下文
在循环内部,将所有面向整个 Chart 的路径改为通过变量访问。使用 $root.Values 代替 .Values,即可跳出局部点号。
{{ range .Values.items }}
release: {{ $root.Release.Name }}
{{ end }}局部点号仍然有效
对于循环项本身,请继续使用普通点号。在 range 内部,点号就是当前元素,这正是您需要的行为。
{{ range .Values.ports }}
- port: {{ . }}
{{ end }}同时使用循环项和根上下文
实际模板通常需要同时使用两者:点号中的循环项,以及根上下文中的 Chart 值。捕获 $root 后,您就能清晰地分别引用它们。
{{ $root := . }}
{{ range .Values.hosts }}
host: {{ . }}.{{ $root.Values.domain }}
{{ end }}常见的命名选择
许多 Chart 会将这个变量命名为 $root 或 $top,但名称由您决定。关键是在 range 重新绑定点号之前捕获它。
使用索引和值的 range
双变量形式会直接绑定索引和值,因此点号可以继续自由使用。即便如此,捕获根上下文仍然是最安全的习惯。
{{ range $i, $v := .Values.ports }}
- {{ $i }}: {{ $v }}
{{ end }}with 内部的同一陷阱
with 代码块也会将点号重新绑定到一个子树。相同的根上下文捕获技巧可以解决其中对整个 Chart 的引用问题。
测试循环输出
渲染 Chart 并检查循环。helm template 会显示每次迭代是否按照预期解析了根值。
helm template ./mychart进入循环前捕获
顺序很重要:请在循环外部赋值 $root := .。如果在 range 内部捕获,点号已经被重新绑定,保存的就会是错误的值。
快速检查
在 range 循环内部,{{ .Values.port }} 突然什么也不返回。
回顾
您已经了解到,range 会重新绑定点号,$root := . 会保存原始上下文,而局部点号仍然表示循环项。🔁
常见问题解答
「在 range 中保留根点作用域」课时是免费的吗?
是的 — 「在 range 中保留根点作用域」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Helm Academy 课程的其余内容,请升级到 CoddyKit PRO。 Helm Academy 课程共包含 4 节课。
「在 range 中保留根点作用域」这节课中我会学到什么?
在循环中使用捕获的根引用 你通过在浏览器中直接运行的动手代码来练习 Helm Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Helm Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Helm Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「在 range 中保留根点作用域」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Helm Academy 课中编写并运行代码吗?
能。每节 Helm Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 分配模板变量
- 在 range 中保留根点作用域
- 实践中的 nindent 与 indent
- 调试渲染后的空白