【问题标题】:Get value from a list inside a map elixir从地图长生不老药中的列表中获取值
【发布时间】:2021-08-19 22:40:36
【问题描述】:

我有一个看起来像这样的结构:

defmodule WarGame.Core.Game do
 
  defstruct user_cards: [],
        croupier_cards: [],
        user_bets: [],
        bets: [:card_odd, :color_player],
        deck: %{},
        used: [],
        title: nil

我想创建一个函数,它可以获取列表 bets 的选定元素并将其移动到 user_bets。我怎么能做到这一点?此列表中将只有有限 (5) 个元素。

在我的脑海里是这样的:

def select_bet(bet) do
  finds bet in %WarGame.Core.Game{}.bets
  inserts it to %WarGame.Core.Game{}.user_bets
end

我怎样才能做到这一点?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    是不可变的,因此您的函数首先应该接收结构和bet。如果找到下注,它将返回一个修改过的结构,否则返回一个未修改的结构。

    最简单的方法是检查-- [bet]是否修改了赌注,如果是,则将赌注添加到user_bets

    def select_bet(%WarGame.Core.Game{} = game, bet) do
      game_bets = game.bets # for the pin operator to work
    
      {bets, user_bets} =
        case game_bets -- [bet] do
          ^game_bets -> {game_bets, game.user_bets}
          bets -> {bets, [bet | game.user_bets]}
        end
    
      %WarGame.Core.Game{game | bets: bets, user_bets: user_bets}
    end
    

    或者,更简洁。

    def select_bet(%WarGame.Core.Game{} = game, bet) do
      game_bets = game.bets # for the pin operator to work
    
      case game_bets -- [bet] do
        ^game_bets -> 
          game
        bets ->
          %WarGame.Core.Game{game |
            bets: bets, 
            user_bets: [bet | game.user_bets]}
      end
    end
    

    【讨论】:

    • 感谢您的回复!当我尝试遵循您的代码时,我收到一个错误 - (CompileError) 一元运算符 ^ 的无效参数,期望一个现有变量,得到:^game.bets
    • 啊,pin 运算符不适用于直接寻址的地图字段。我已经修复了代码。
    • 我在答案中做了。我只从bets 中减去由bet 组成的列表。如果列表没有更改,则没有可用的投注,我们不会修改任何内容。否则,我们将bets 重新分配给bets,不带bet,将user_bets 重新分配给user_bets,再加上bet
    • 非常感谢您的帮助。这对我来说有点复杂,所以完全理解它需要一些时间:)
    • 不要修改第二种情况下的投注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多