Elixir生成内容

时间:2016-10-23 16:56:34

标签: elixir

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=========

1 个答案:

答案 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