将嵌套元组转换为Elixir中的列表

shi*_*ira 5 elixir

尝试做:

def nested_tuple_to_list(tuple) when is_tuple(tuple) do
  ...
end
Run Code Online (Sandbox Code Playgroud)

期望得到:

    iex> example = {"foo", "bar", {"foo", "bar"}}
    iex> example_as_list = nested_tuple_to_list(example)
    iex> example_as_list
    ["foo", "bar", ["foo", "bar"]]
Run Code Online (Sandbox Code Playgroud)

我的问题是最好的方法是什么?

Dog*_*ert 6

使用Tuple.to_list/1并映射具有相同功能的结果列表,并为非元组输入添加一个fallback子句:

defmodule A do
  def nested_tuple_to_list(tuple) when is_tuple(tuple) do
    tuple |> Tuple.to_list |> Enum.map(&nested_tuple_to_list/1)
  end
  def nested_tuple_to_list(x), do: x
end

{"foo", "bar", {"foo", "bar"}} |> A.nested_tuple_to_list |> IO.inspect
Run Code Online (Sandbox Code Playgroud)

输出:

["foo", "bar", ["foo", "bar"]]
Run Code Online (Sandbox Code Playgroud)

如果还要转换列表内的元组,则可以添加:

def nested_tuple_to_list(list) when is_list(list) do
  list |> Enum.map(&nested_tuple_to_list/1)
end
Run Code Online (Sandbox Code Playgroud)

这可以轻松扩展以处理地图。


Fre*_*Dog 1

有一个库可以执行此操作以及嵌套数据的许多其他转换。

iex(1)> h PhStTransform.transform

        def transform(data_structure, function_map, depth \\ [])
Run Code Online (Sandbox Code Playgroud)

使用给定function_map来转换任何 Elixir data structure

function_map应包含与要转换的数据类型相对应的键。每个键必须映射到一个函数,该函数采用该数据类型和可选的深度列表作为参数。

depth应始终保留默认值,因为它用于内部递归。

例子

iex> atom_to_string_potion = %{ Atom => fn(atom) -> Atom.to_string(atom) end }
iex> PhStTransform.transform([[:a], :b, {:c, :e}], atom_to_string_potion)
[["a"], "b", {"c", "e"}]

iex> foo = {"foo", "bar", {"foo", "bar"}}
{"foo", "bar", {"foo", "bar"}}

iex> PhStTransform.transform(foo, %{Tuple => fn(tuple) -> Tuple.to_list(tuple) end})
["foo", "bar", ["foo", "bar"]]
Run Code Online (Sandbox Code Playgroud)

https://hex.pm/packages/phst_transform