Elixir初学者在这里!我试图基于配置文件生成一个bash脚本。当我迭代配置并打印我生成的字符串时,一切都很好。但是,当我尝试连接或附加到列表时,我没有得到任何回报!
def generate_post_destroy_content(node_config) do
hosts = create_post_destroy_string(:vmname, node_config)
ips = create_post_destroy_string(:ip, node_config)
content = "#!/bin/bash\n\n#{hosts}\n\n#{ips}"
IO.puts content
end
def create_post_destroy_string(key, node_config) do
# content = ""
content = []
for address <- node_config, do:
# content = content <> "ssh-keygen -f ~/.ssh/known_hosts -R #{address[key]}"]
content = content ++ ["ssh-keygen -f ~/.ssh/known_hosts -R # {address[key]}"]
# IO.puts ["ssh-keygen -f ~/.ssh/known_hosts -R #{address[key]}"]
content = Enum.join(content, "\n")
content
end
我的输出
#!/bin/bash
=========END=========
答案 0 :(得分:1)
Elixir中的变量是不可变的。您的代码在content
的每次迭代中都会创建一个全新的for
。对于此特定代码,您使用for
返回do
块的评估值列表的事实:
def create_post_destroy_string(key, node_config) do
for address <- node_config do
"ssh-keygen -f ~/.ssh/known_hosts -R #{address[key]}"
end |> Enum.join("\n")
end
如果您需要执行更复杂的计算,例如仅在某些条件下添加列表和/或为某些条件添加多个列表,则可以使用Enum.reduce/2
。有关详细信息,请查看this answer。