2015-05-15 17 views
13

desen eşleştirmesi kullanarak yakalama Eş zamanlı olarak bir haritadaki belirli bir anahtarla eşleştirmek istiyorum, ve Bu haritanın geri kalanını yakalamak. Böyle bir şey işe umuyordum:Elixir: Bir haritanın geri kalanını

iex(10)> %{"nodeType" => type | rest} = %{"nodeType" => "conditional", "foo" => "bar"} 

** (CompileError) iex:10: cannot invoke remote function IEx.Helpers.|/2 inside match 

amacı bir harita, haritanın alanlardan birinde desen maçı almak işlevler kümesi yazma ve haritanın geri kalanı üzerinde bazı dönüşümler yapmaktır.

Ancak, bir şey eksikliğimi fark etmediğim sürece, nodeType'ı geçmek için arayana ihtiyacım var gibi görünüyor.

+0

Bu sözdizimi istiyorum. Aynı soruyu sormak üzereydim ve aynı sözdizimini tam olarak tahmin etmiştim 'def update_document (% {id: id, revizyon: revizyon | rest}) # couchdb maddesini buradan yap end' –

+0

Genel not alanı nodeType', sadece bir haritanın aksine bir "struct" kullanılarak daha iyi sunulmuş olabileceğinizi gösterir. Http://elixir-lang.github.io/getting-started/structs.html adresine bakın. Tam kullanım durumunuzu bilmeden, emin olamadım, ama tasvir edilen kullanım bana en iyi aracı kullanmadığınız bir kod kokusu mevcut. –

cevap

11

Tüm haritayı kolayca yakalayabilirsiniz - belki bu yeterli olur mu?

def handle_condition(all = %{"nodeType" => "condition"}) do 
    # do something with all 
end 

Veya:

def handle_condition(all = %{"nodeType" => "condition"}) do 
    all = Map.delete(all, "nodeType") 
    # do something with all 
end 
0

Bunu gerçekleştirmenin bir başka güzel bir yolu Map.pop/2 kullanmaktır:

def handle(%{} = map), do: handle(Map.pop(map, "nodeType")) 

def handle({"condition", rest}) do 
    # ... handle conditions here 
end 

def handle({"expression", rest}) do 
    # ... handle expressions here 
end 
İlgili konular