Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 我怎么才能这样匹配呢_Elixir - Fatal编程技术网

Elixir 我怎么才能这样匹配呢

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,则此操作失败。我该怎么做?有没有一个好方法可以做到这一点,或者我应该用另一种方

我有一个函数,它接受一个集合,它是一个id/项元组列表,应该替换给定的项、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]

谢谢你的回答。这当然有效,但我接受的答案更短,更符合我的要求。谢谢你的回答。这当然有效,但我接受的答案更短,更符合我的要求。