2017-01-05 102 views
3

列出要做的:轉換嵌套的元組靈藥

def nested_tuple_to_list(tuple) when is_tuple(tuple) do 
    ... 
end 

期望得到:

iex> example = {"foo", "bar", {"foo", "bar"}} 
    iex> example_as_list = nested_tuple_to_list(example) 
    iex> example_as_list 
    ["foo", "bar", ["foo", "bar"]] 

我的問題是:如何做到這一點的最好方法是什麼?

回答

1

有一個庫可以做到這一點以及嵌套數據的其他轉換。

iex(1)> h PhStTransform.transform 

     def transform(data_structure, function_map, depth \\ []) 

使用給定function_map轉化任何藥劑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"]] 

https://hex.pm/packages/phst_transform

3

使用Tuple.to_list/1和地圖具有相同功能的結果列表中,並添加備用條款對非元組輸入:

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 

輸出:

["foo", "bar", ["foo", "bar"]] 

如果你想裏面變換元組列表以及,你可以添加:

def nested_tuple_to_list(list) when is_list(list) do 
    list |> Enum.map(&nested_tuple_to_list/1) 
end 

這可以很容易地擴展到處理地圖爲好。