更新MapSet中的struct元素

时间:2018-03-10 18:37:49

标签: elixir

我将变量游戏与由结构组成的MapSet相匹配。 在shell游戏中返回

   iex(7)> game = Game.new
 #MapSet<[
  %Tris.Coordinate{col: 1, color: nil, row: 1},
  %Tris.Coordinate{col: 1, color: nil, row: 2},
  %Tris.Coordinate{col: 1, color: nil, row: 3},
  %Tris.Coordinate{col: 2, color: nil, row: 1},
  %Tris.Coordinate{col: 2, color: nil, row: 2},
  %Tris.Coordinate{col: 2, color: nil, row: 3},
  %Tris.Coordinate{col: 3, color: nil, row: 1},
  %Tris.Coordinate{col: 3, color: nil, row: 2},
  %Tris.Coordinate{col: 3, color: nil, row: 3}
 ]>

游戏MapSet由9个固定元素组成。我想更新每个Coordinate元素的颜色字段。类似于:col:1,row:1 color:“red”或替代col:1,row:2,color:“blue”。最好的方法是什么?我不想添加新元素但更改现有元素。 MapSet应仅由9个坐标元素组成。

1 个答案:

答案 0 :(得分:0)

MapSet是不可变的,您无法在不删除和重新插入的情况下更改其键。要基于部分匹配查找元素,需要遍历整个MapSet。以下是如何实现这一目标:

game
|> Enum.map(fn coord ->
  if coord.row == 1 && coord.col == 2 do
    %{coord | color: "red"}
  else
    coord
  end
end).
|> MapSet.new

我不确定你为什么要首先将它存储在MapSet中,但你可能要考虑将其存储在列表([1, 2, ..., 9])或元组({{1 }}或嵌套元组({1, 2, ..., 9})。