Elixir中更新含字符串键的Map时brand值未更新,求助排查
问题分析与解决:Map值未更新的原因
嘿,我来帮你揪出问题的根源!你遇到的核心问题和Elixir的一个核心特性有关——所有数据结构都是不可变的。这意味着你没法直接修改一个已存在的Map,任何看似“修改”的操作都会返回一个全新的Map实例,而原Map会保持原样。
看你的代码,最后一行调用了Map.put(product, "brand", brand),但你没有把这个新生成的Map重新赋值给product变量!所以原来的product根本没被改变,这就是为什么日志里的actual product brand还是旧值。
修正后的代码示例
你只需要把Map.put返回的新Map重新赋值给product就行,修改后的代码如下:
brand = URI.decode(product["brand"]) IO.inspect(brand, label: "uri decode") brand = elem(Poison.decode(brand), 1) IO.inspect(brand, label: "json decode") # 关键:将新Map赋值回product变量 product = Map.put(product, "brand", brand) IO.inspect(product["brand"], label: "actual product brand")
为什么这样能生效?
Map.put/3的作用是创建一个包含新"brand"值的全新Map,而不是修改原来的product。只有把这个新Map赋值给product变量后,后续访问product["brand"]才会拿到更新后的值。这样修改后,你的日志输出里的actual product brand就会和json decode的结果一致了。
另外给你个小优化建议:elem(Poison.decode(brand), 1)可以换成更健壮的模式匹配写法:
{:ok, brand} = Poison.decode(brand)
这样如果JSON解码失败,程序会明确抛出错误,比直接取第二个元素更利于排查问题~
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

