Elixir 我怎么才能这样匹配呢
我有一个函数,它接受一个集合,它是一个id/项元组列表,应该替换给定的项、id和新项Elixir 我怎么才能这样匹配呢,elixir,Elixir,我有一个函数,它接受一个集合,它是一个id/项元组列表,应该替换给定的项、id和新项 def update_item(collection, id, new_item) do Enum.map(collection, fn ({ ^id, _ }) -> { id, new_item } (entry) -> entry end) end 如果出现编译器错误和消息未绑定变量^id,则此操作失败。我该怎么做?有没有一个好方法可以做到这一点,或者我应该用另一种方
def update_item(collection, id, new_item) do
Enum.map(collection, fn
({ ^id, _ }) -> { id, new_item }
(entry) -> entry
end)
end
如果出现
编译器错误
和消息未绑定变量^id
,则此操作失败。我该怎么做?有没有一个好方法可以做到这一点,或者我应该用另一种方法来实现这一点?使用经典的尾部递归,您可以这样定义update\u item
:
def update_item([{id,}| t],id,new_item)do
[{id,new_item}更新_item(t,id,new_item)]
终止
def更新_项([h|t],id,新_项)do
[h |更新项目(t、id、新项目)]
终止
def更新_项([],u,u)do
[]
终止
更新项目([{4,56},{1,44},{1,33},{2,55}],1,23)
# => [{4, 56}, {1, 23}, {1, 23}, {2, 55}]
如果第一个项的id与输入匹配,则第一个定义将替换第一个项,而第二个定义只是在不替换该项的情况下递归。第三种方法是空列表的停止条件。使用经典尾部递归,您可以定义
update\u item
,如下所示:
def update_item([{id,}| t],id,new_item)do
[{id,new_item}更新_item(t,id,new_item)]
终止
def更新_项([h|t],id,新_项)do
[h |更新项目(t、id、新项目)]
终止
def更新_项([],u,u)do
[]
终止
更新项目([{4,56},{1,44},{1,33},{2,55}],1,23)
# => [{4, 56}, {1, 23}, {1, 23}, {2, 55}]
如果第一个项的id与输入匹配,则第一个定义将替换第一个项,而第二个定义只是在不替换该项的情况下递归。第三种方法是空列表的停止条件。您可以使用guard:
iex(1)> collection = [a: 1, b: 2, c: 3, b: 4]
iex(2)> id = :b
iex(3)> new_item = 5
iex(4)> Enum.map(collection, fn
({coll_id, _ }) when coll_id == id -> { id, new_item }
(entry) -> entry
end)
[a: 1, b: 5, c: 3, b: 5]
您可以使用guard:
iex(1)> collection = [a: 1, b: 2, c: 3, b: 4]
iex(2)> id = :b
iex(3)> new_item = 5
iex(4)> Enum.map(collection, fn
({coll_id, _ }) when coll_id == id -> { id, new_item }
(entry) -> entry
end)
[a: 1, b: 5, c: 3, b: 5]
谢谢你的回答。这当然有效,但我接受的答案更短,更符合我的要求。谢谢你的回答。这当然有效,但我接受的答案更短,更符合我的要求。