2015-05-15 14 views
13

Tôi muốn đồng thời khớp với một khóa cụ thể trong bản đồ, chụp phần còn lại của bản đồ đó. Tôi đã hy vọng một cái gì đó như thế này sẽ làm việc:Elixir: Chụp phần còn lại của bản đồ bằng cách sử dụng đối sánh mẫu

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

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

Mục đích là viết một tập hợp các chức năng lấy bản đồ, khớp mẫu trên một trong các trường của bản đồ và thực hiện một số biến đổi trên phần còn lại của bản đồ.

def handle_condition(%{"nodeType" => "condition" | rest}) do 
    # do something with rest 
done 
def handle_expression(%{"nodeType" => "expression" | rest}) do 
    # do something with rest 
done 

Nhưng có vẻ như tôi cần callee để vượt qua nodeType riêng trừ khi tôi thiếu thứ gì đó.

+0

Tôi muốn cú pháp này. Tôi vừa định hỏi cùng một câu hỏi và đã đoán đúng chính xác cú pháp 'def update_document (% {id: id, sửa đổi: sửa đổi | phần còn lại}) làm # couchdb ở đây end' –

+0

Lưu ý chung, trường ' nodeType' cho biết bạn có thể được phục vụ tốt hơn bằng cách sử dụng 'struct' trái ngược với một bản đồ đơn thuần. Xem http://elixir-lang.github.io/getting-started/structs.html Nếu không biết trường hợp sử dụng chính xác của bạn, tôi không thể khẳng định chắc chắn, nhưng cách sử dụng được mô tả là một mùi mã với tôi bạn không sử dụng công cụ tốt nhất có sẵn. –

Trả lời

11

Bạn có thể dễ dàng chụp toàn bộ bản đồ - có thể điều này sẽ là đủ?

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

Hoặc:

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

Một cách thoải mái để đạt được điều này bằng cách sử dụng Map.pop/2:

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 
Các vấn đề liên quan