web-dev-qa-db-ja.com

Elixirは構造体をマップに変換します

すべてのnil値を消去できるように、構造体をマップに変換しようとしています

現在このコードを使用しています

  case Nadia.get_updates  do
    {:ok, results} ->
      Map.from_struct(results)
      |> Enum.filter(fn {_, v} -> v != nil end)
      |> Enum.into(%{})

注:Nadia.get_updatesは次の構造を返します。 https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/

しかし、私は常に次のエラーを受け取ります:Map.from_struct/1に一致する関数句がありません

25
user2070502

v0.15 なので、Map.from_struct/1これはまさにこれを行います。

defmodule User do
  defstruct [:name]
end

Map.from_struct(%User{name: "valim"})
#=> %{name: "valim"}
46
Juliano

別のトリックがあります

my_struct = %MyStruct{}
my_map = Map.delete my_struct, :__struct__
11
radzserg
get_updates([{atom, any}]) ::
  {:ok, [Nadia.Model.Update.t]} |
  {:error, Nadia.Model.Error.t}

成功すると、Nadia.Model.Update.tのリストが返されます。そのため、このエラーが発生します。

2
Sasha Fonseca

FWIW、私はあなたのためにこの種のことを自動的に行うためのライブラリを書きました。

https://github.com/philosophers-stone/transform

これはテストコードからのものです。

test "implement scrub of empty values from map" do
  data = %{ :a => nil, :b => "", :c => "a"}
  replace_empty = fn(string, _d) -> if( string == "", do: nil , else: string) end
  replace_nil = fn(map, _depth) ->  for {k, v} <- map, v != nil , into: %{}, do: {k, v} end
  potion = %{ BitString => replace_empty, Map => replace_nil}

  assert PhStTransform.transform(data, potion) == %{:c => "a"}

end

データがマップのリストである場合、これはまだうまく機能することに注意してください。 PhStTransformライブラリは、マップが見つかるまでデータを引き離し続けます。あなたの場合、興味のある構造体の種類で機能するreplace_nil関数を使用します。