如何将嵌套键作为变量传入Map,实现嵌套值的获取?
在Elixir中通过嵌套键获取Map的深层值
嘿,这个场景太常见了!在Elixir里要获取Map的嵌套值,其实有几种简洁的方式,我结合你的例子一步步说:
你的示例Map是:
my_map = %{a: 1, b: %{c: 234}}
方法1:使用get_in/2(最推荐的标准方式)
你可以把嵌套路径定义成一个键的列表作为「嵌套键」,然后用get_in/2来直接取值:
my_nest_key = [:b, :c] my_nest_val = get_in(my_map, my_nest_key) # 结果是234
这个方法是Elixir官方推荐的,不仅支持Map,还能兼容列表、结构体等实现了Access行为的数据结构,非常灵活。
方法2:直接使用Access的管道语法(更直观的链式调用)
如果你不想单独定义嵌套键变量,也可以直接用Access模块的链式调用:
my_nest_val = my_map |> Access.get(:b) |> Access.get(:c) # 结果也是234
这种方式适合临时取值,代码可读性很高。
方法3:自定义支持嵌套键的Map(不推荐,除非特殊需求)
如果硬要实现my_map[my_nest_key]这种直接的语法,你需要自己封装一个实现了Access行为的结构,但这完全没必要——因为官方的get_in已经足够好用了。不过如果好奇的话,简单示例如下:
defmodule NestedMap do defstruct [:data] def new(data), do: %__MODULE__{data: data} defimpl Access do def get(%NestedMap{data: data}, [key | rest]), do: get_in(data, [key | rest]) def get(%NestedMap{data: data}, key), do: data[key] end end # 使用方式 my_nested_map = NestedMap.new(%{a: 1, b: %{c: 234}}) my_nest_key = [:b, :c] my_nest_val = my_nested_map[my_nest_key] # 结果234
但再次强调,这种方式属于过度封装,日常开发用get_in就够了。
总结一下,最实用的就是第一种方法,用列表作为嵌套路径,配合get_in/2,既简洁又符合Elixir的惯用写法。
内容的提问来源于stack exchange,提问作者user9728471
相关产品推荐
相关产品推荐

