【问题标题】:Records pattern matching in Erlang在 Erlang 中记录模式匹配
【发布时间】:2018-01-08 17:08:17
【问题描述】:

为了好玩,我正在尝试用 Erlang 重新创建我最喜欢的棋盘游戏之一,并且 我正在尝试模式匹配嵌套记录,无论我尝试什么,我总是会收到错误消息:

** exception error: no function clause matching 
                kingoftokyo_server:add_player("john",
                  {gamestate,[],[],[],[]}) (kingoftokyo_server.erl, line 40)

我的代码如下所示:

 -record(player,{playerName,cards,energy}).
 -record(board,{city_center,outside}).
 -record(gamestate,{board,player,dices,game_round}).

 add_player(Name,{Board,{PlayerName,Cards,Energy},Dices,Game_round}) ->
    NewList = lists:append(Name, PlayerName),
    NewState = {Board,{NewList,Cards,Energy},Dices,Game_round},
    NewState.

我不明白为什么该子句在 add_player 函数中不匹配。我已经尝试了所有我能找到的方法,但不明白为什么这不起作用。

任何指针将不胜感激!

【问题讨论】:

    标签: erlang


    【解决方案1】:

    Erlang 记录是元组,但它们有一个额外的字段作为第一个元素:记录的名称。也就是说,对于您定义的记录,#board{city_center = 1, outside = 2} 等于 {board, 1, 2}。虽然您可以使用元组模式来提取字段,但如果您决定重新排序任何字段,这将中断。您可以使用记录模式匹配语法按名称匹配字段。

    以下代码应该适合您:

    add_player(Name,
               #gamestate{
                 board = Board,
                 player = #player{playerName = PlayerName, cards = Cards, energy = Energy},
                 dices = Dices,
                 game_round = Game_round}) ->
    

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2011-11-10
      • 2014-06-27
      • 2011-11-27
      • 1970-01-01
      • 2015-02-09
      • 2014-01-11
      • 2019-12-13
      • 2016-10-29
      相关资源
      最近更新 更多