首页 理论教育 使用Elixir行为创建出口

使用Elixir行为创建出口

更新时间:2025-01-19 工作计划 版权反馈
【摘要】:我们将运用Elixir的行为。创建lib/dungeon_crawl/room/triggers/exit.ex文件:我们使用@behaviour指令告诉Elixir Exit模块遵守Room.Trigger契约。该契约要求需要实现一个run/2函数。如果我们不实现run/2函数,编译器将提示缺少函数。它返回一个由角色和:exit标志组成的元组,表示该角色找到了出口。现在我们要更新DungeonCrawl.CLI.Main以便运行触发器。如果handle_action_result/2函数匹配:exit标志,游戏结束;否则它会递归调用crawl/2。他们可以继续添加遵守Room.Trigger契约的房间触发模块。

在我们的游戏里,玩家可以走进许多房间。每个房间都可以选择若干动作。玩家选择一种动作,然后会引发某种情况。尽管每种情况都不相同,但是情况触发器最好具有统一的输入和输出。如果这些函数遵守相同的行为,拥有统一的执行入口,我们就能少写许多条件代码。

我们为每种类型的房间构建一个模块。模块内部的函数将处理玩家选择的动作。该函数接收角色和动作作为参数,然后返回角色和一个标志。当标志是:exit时,游戏结束;当标志是:forward时,游戏继续。我们将运用Elixir的行为。创建lib/dungeon_crawl/room/trigger.ex文件,在其中编写如下模块:

我们使用@callback指令告诉Elixir要定义一个函数规则。它的语法与创建函数的方式非常相似。我们规定了一个名为run的函数,它必须有两个参数(character和action)。参数名称后面有两个冒号,单词any表示参数可以是任意类型。函数声明之后又有两个冒号,这里的any表示函数返回值可以是任意类型。这样,所有遵守这个契约的模块必须有一个名为run的函数,它有两个任意类型的参数,并且可以返回任意类型的值。这不是一个严格的契约,但它足以用来生成第一个房间触发器。

让我们构建出口房间的触发器。玩家进入这个房间后,什么都不会发生,直接返回:exit标志。创建lib/dungeon_crawl/room/triggers/exit.ex文件:

我们使用@behaviour指令告诉Elixir Exit模块遵守Room.Trigger契约。该契约要求需要实现一个run/2函数。如果我们不实现run/2函数,编译器将提示缺少函数。试试运行mix,查看错误消息:

提醒开发人员缺少函数是非常有用的。现在让我们实现run/2函数:(www.xing528.com)

这个函数是非常简单的。它返回一个由角色和:exit标志组成的元组,表示该角色找到了出口。下一步是构建一个包含退出触发器的房间。让我们更新DungeonCrawl.Room模块:

我们为DungeonCrawl.Room.Triggers添加了一个别名,以简化对模块中房间触发器的使用。我们已经将触发器属性添加到房间的结构体中,它将存储一个遵守Room.Trigger契约的模块。在all/0函数中,我们创建了一个带有退出触发器的房间。现在我们要更新DungeonCrawl.CLI.Main以便运行触发器。首先,函数crawl的参数中必须有一个角色:

现在crawl的参数中有角色了,这样才能根据房间内的动作更新角色的健康状况。让我们再添加两个新辅助函数:一个用于运行触发器,另一个用于处理触发器的结果:

trigger_action/2很简单,它先清屏,然后从存储在trigger属性中的模块调用run/2函数。如果handle_action_result/2函数匹配:exit标志,游戏结束;否则它会递归调用crawl/2。运行mix start,查看效果:

我们已经完成了游戏的主要部分,它现在包含启动和退出。我们使用行为简化了开发人员在游戏中实现新关卡的任务。他们可以继续添加遵守Room.Trigger契约的房间触发模块。接下来我们使用类型规范(type specifications或typespecs)来进一步完善它。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈