如何通过模式匹配修改Elixir元组中的指定元素?
用模式匹配修改Elixir元组指定内容
当然可以通过模式匹配实现,核心是利用Elixir的模式匹配拆解原有结构,修改目标元素后重新组装成新结构(Elixir数据不可变,无法直接修改原元组,只能生成新的)。
针对你给出的元组,具体实现步骤如下:
- 定义原始元组:
original = {1, [{:reach, [:s, :d]}, [link: [:s, :d]]]}
- 用模式匹配拆解出需要保留和修改的部分:
{num, [{:reach, args}, link_entry]} = original
这里通过嵌套匹配,直接定位到:reach所在的元组,提取出外层数字num、:reach对应的参数args,以及不需要修改的link_entry。
- 修改目标元素并重组新元组:
new_reach = {:reach_1, args} new_tuple = {num, [new_reach, link_entry]}
也可以把步骤2和3合并成一行更简洁的写法:
{num, [{:reach, args}, link_entry]} = original new_tuple = {num, [{:reach_1, args}, link_entry]}
执行后new_tuple的结果就是:
{1, [{:reach_1, [:s, :d]}, [link: [:s, :d]]]}
如果你的列表元素位置不固定,还可以结合Enum.map遍历列表,用模式匹配匹配目标元素进行修改,比如:
{num, entries} = original new_entries = Enum.map(entries, fn {:reach, args} -> {:reach_1, args} entry -> entry end) new_tuple = {num, new_entries}
这种写法更灵活,不管:reach所在元素在列表的哪个位置都能处理。
内容的提问来源于stack exchange,提问作者Owais Qayum
相关产品推荐
相关产品推荐

