我正在尝试根据字典中最长的单词来计算所需的空间。
尽管变量num
似乎没有将其值传输到第二个内部循环。
我基本上是在尝试计算空格数量以正确对齐列。
{% for module in modules %}
module "{{ module.name }}" {
source = "{{ module.source }}"
{% set num = 1 %}
{% for n in module.vars.keys() %}
{% if num < n|length %}
{% set num = n|length %}
{% endif %}
{{ num }}: {{ n }}
{% endfor %}
{% for m in module.vars %}
{{ num }}
{{ m }} {{ '= "' + module.vars[m]|indent(width=num) }}"
{% endfor %}
}
答案 0 :(得分:1)
是的,您不能以这种方式使变量脱离循环。请参阅docs中的“作用域界定”。
一种选择是使用他们的建议并创建一个命名空间:
{% set ns = namespace(num=0) %}
{% for n in module.vars.keys() %}
{% if ns.num < n|length %}
{% set ns.num = n|length %}
{% endif %}
{{ ns.num }}: {{ n }}
{% endfor %}
在您的情况下,有一个更简单,更干净的解决方案:您可以计算表达式中的最大宽度。使用map()
获取长度列表,并使用max
过滤器获取最大长度:
{% set indent_width = module.vars.keys() | map("length") | max %}
{% for m in module.vars %}
{{ m }} {{ '= "' + module.vars[m]|indent(width=indent_width) }}"
{% endfor %}