gpt4 book ai didi

erlang - 如何将 Erlang 对象结构转换为 Elixir Map?

转载 作者:行者123 更新时间:2023-12-02 07:13:11 24 4
gpt4 key购买 nike

我正在使用couchbeam从 Elixir 联系 CouchDB。

但是该库给了我旧的 erlang 对象表示形式,例如 {[{"foo", "bar"}]} 而不是 elixir 映射,这是由于该库使用 jiffy:decode 而不使用return_maps,如何将此对象结构转换为 Elixir 映射(反之亦然)?

我发现了一种 hackish 方法来 jiffy:encode 和 jiffy:decode 它再次使用 return_maps ...但一定还有另一种选择吗?

更新:

从 Hynek 在 erlang 中的示例来看,这似乎有效:

defmodule ToMaps do

def convert({x}) when is_list(x) do
Map.new(x, fn {k, v} -> {k, convert(v)} end)
end

def convert([head | tail]) do
[convert(head) | convert(tail)]
end

def convert(x) do
x
end
end

似乎可以完成这项工作。

iex(1)> ToMaps.convert({[{"foo",[{[{"a",1}]},3]},{"bar","baz"}]})

%{"bar" => "baz", "foo" => [%{"a" => 1}, 3]}

最佳答案

我不知道 Elixir,但在 Erlang 中:

-module(to_maps).

-export([to_maps/1]).

to_maps({L}) when is_list(L) ->
maps:from_list([{K, to_maps(V)} || {K, V} <- L]);
to_maps([H|T]) ->
[to_maps(H) | to_maps(T)];
to_maps(X) -> X.

编辑:

反向:

from_maps(#{} = M) ->
F = fun(K, V, Acc) -> [{K, from_maps(V)} | Acc] end,
{maps:fold(F, [], M)};
from_maps([H|T]) ->
[from_maps(H) | from_maps(T)];
from_maps(X) -> X.

我不推荐它,但它甚至可以是一个函数:

convert({L}) when is_list(L) ->
maps:from_list([{K, convert(V)} || {K, V} <- L]);
convert(#{} = M) ->
F = fun(K, V, Acc) -> [{K, convert(V)} | Acc] end,
{maps:fold(F, [], M)};
convert([H|T]) ->
[convert(H) | convert(T)];
convert(X) -> X.

用法:

1> jiffy:decode(<<"{\"foo\":[3, {\"a\":1}], \"bar\":\"baz\"}">>).
{[{<<"foo">>,[3,{[{<<"a">>,1}]}]},{<<"bar">>,<<"baz">>}]}
2> to_maps:to_maps(v(-1)).
#{<<"bar">> => <<"baz">>,<<"foo">> => [3,#{<<"a">> => 1}]}
3> to_maps:from_maps(v(-1)).
{[{<<"foo">>,[3,{[{<<"a">>,1}]}]},{<<"bar">>,<<"baz">>}]}
4> to_maps:convert(v(-1)).
#{<<"bar">> => <<"baz">>,<<"foo">> => [3,#{<<"a">> => 1}]}
5> to_maps:convert(v(-1)).
{[{<<"foo">>,[3,{[{<<"a">>,1}]}]},{<<"bar">>,<<"baz">>}]}
6> to_maps:convert(v(-1)).
#{<<"bar">> => <<"baz">>,<<"foo">> => [3,#{<<"a">> => 1}]}
...

关于erlang - 如何将 Erlang 对象结构转换为 Elixir Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40845339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com