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

如何在Elixir中将两个列表逐一映射为带角色的Player结构体列表

解决方案

可以用Enum.zip/2结合Enum.map/2来实现,这是Elixir中处理这类一一对应映射场景的惯用方式,完全不需要依赖低效的索引操作:

players = [
  %Player{name: "John", role: "nil"},
  %Player{name: "Sansa", role: "nil"},
  %Player{name: "Barry", role: "nil"},
  %Player{name: "Edward", role: "nil"}
]

shuffled_roles = Enum.shuffle([:werewolf, :farmer, :farmer, :farmer])

updated_players =
  Enum.zip(players, shuffled_roles)
  |> Enum.map(fn {player, role} ->
    # 将原子角色转为带冒号的字符串,匹配你预期的格式
    %{player | role: ":" <> Atom.to_string(role)}
  end)

操作说明

  1. Enum.zip/2:把players和shuffled_roles两个列表按位置配对,生成元组列表,格式为[{player1, role1}, {player2, role2}, ...]。
  2. Enum.map/2:遍历每个元组,用Elixir结构体的更新语法%{player | role: ...}修改Player的role字段——这里把原子类型的角色转成了你预期的带冒号前缀的字符串格式。

如果实际需求中role不需要带冒号前缀,直接用Atom.to_string(role)就能得到"farmer"或"werewolf"格式的字符串。

内容的提问来源于stack exchange,提问作者Kevin Tanudjaja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:10:16