You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套键作为变量传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:24:08