我有一个配置文件,我想用以下格式阅读
[key_1]
inner_key_1 inner_entry_1
inner_key_2 inner_entry_2
inner_key_3 inner_entry_3
inner_key_4 inner_entry_4
[key_2]
inner_key_5 inner_entry_5
inner_key_6 inner_entry_6
inner_key_7 inner_entry_7
inner_key_8 inner_entry_8
Run Code Online (Sandbox Code Playgroud)
然后将其映射到嵌套的Elixir字典中.
%{key_1 => %{inner_key_1 => inner_entry_1, ... }, key_2 => %{inner_key_5 => inner_entry_5,...}}
Run Code Online (Sandbox Code Playgroud)
我无法用Elixir和函数式编程来概念化如何做到这一点.我已经尝试使用Stream库来实现这一目标,但没有运气.
一个简单的解决方案可能看起来类似于:
def read_config(file) do
file
|> File.stream!()
|> Stream.map(&String.trim/1)
|> Enum.reduce({%{}, nil}, &read_config/2)
|> elem(0)
end
defp read_config("[" <> key, {acc, _top_key}) do
key = String.trim_trailing(key, "]")
{Map.put(acc, key, %{}), key}
end
defp read_config(key_value, {acc, top_key}) do
[key, value] = String.split(key_value, " ")
{put_in(acc, [top_key, key], value), top_key}
end
Run Code Online (Sandbox Code Playgroud)
在将命令式循环转换为函数式时,您通常会使用reduce.下一步是确定每次迭代期间所需的所有状态 - 在这种情况下,我们需要"到目前为止的结果"和当前的顶级密钥 - 这与您在命令式解决方案中使用的类似循环外的可变变量.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |