如何在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)
操作说明
Enum.zip/2:把players和shuffled_roles两个列表按位置配对,生成元组列表,格式为[{player1, role1}, {player2, role2}, ...]。Enum.map/2:遍历每个元组,用Elixir结构体的更新语法%{player | role: ...}修改Player的role字段——这里把原子类型的角色转成了你预期的带冒号前缀的字符串格式。
如果实际需求中role不需要带冒号前缀,直接用Atom.to_string(role)就能得到"farmer"或"werewolf"格式的字符串。
内容的提问来源于stack exchange,提问作者Kevin Tanudjaja
相关产品推荐
相关产品推荐

