2016-04-09 6 views
14

मैं एक नक्शे के लिए एक struct कन्वर्ट करने के लिए मैं वर्तमान में इस कोड का उपयोग कर रहा हूँअमृत परिवर्तित struct

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

नोट सब शून्य मान

साफ करने के लिए सक्षम होने के लिए कोशिश कर रहा हूँ मैप करने के लिए। https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/0

फिर भी मैं हमेशा निम्न त्रुटि प्राप्त कर रहा हूँ: get_updates निम्नलिखित संरचना रिटर्न Map.from_struct में कोई समारोह खंड मिलान/1

+5

शायद 'परिणाम' इन structs की एक सूची है? न केवल एक संरचना? – JustMichael

उत्तर

1
01,

सफल होने पर यह Nadia.Model.Update.t की एक सूची देता है। यही कारण है कि आपको वह त्रुटि मिलती है।

1

एफडब्ल्यूआईडब्ल्यू, मैंने एक पुस्तकालय लिखा है जो आपके लिए इस तरह की चीज करेगा स्वचालित रूप से डेटा संरचना को अलग करने के लिए।

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 समारोह है कि structs के प्रकार आप में रुचि रखते हैं पर काम किया का प्रयोग करेंगे।

6

एक और चाल

my_struct = %MyStruct{} 
my_map = Map.delete my_struct, :__struct__ 
18

है v0.15 जब से हम Map.from_struct/1 जो वास्तव में यह करता है।

defmodule User do 
    defstruct [:name] 
end 

Map.from_struct(%User{name: "valim"}) 
#=> %{name: "valim"} 
संबंधित मुद्दे