首页 理论教育 函数式编程入门:使用Elixir控制非纯函数流程

函数式编程入门:使用Elixir控制非纯函数流程

时间:2023-11-20 理论教育 版权反馈
【摘要】:处理意外事件的第一种策略是控制流程。你可以使用条件语句来处理非纯函数的结果。如果返回的不是数字,那么用Integer.parse/1解析它可能会导致错误。所以我们用case的模式匹配做检查。我们用Integer.parse/1和case检查用户输入是否是数字。用display_invalid_option/0显示错误消息,并在输入无效时请用户再次输入。编写以下函数:我们用Enum.at/2查找选项,如果找不到就返回nil;如果找到了,则返回choose_option。每种策略都将重构ask_for_option/1的内部结构。

函数式编程入门:使用Elixir控制非纯函数流程

处理意外事件的第一种策略是控制流程。你可以使用条件语句(如case、if、函数子句)来处理非纯函数的结果。它们非常灵活,适合处理简单的情况,但不适合处理复杂的情况。让我们看一个例子:

程序要求用户输入一个数字。函数IO.gets/1用来获取用户的输入。我们知道IO.gets/1是一个非纯函数,它可以返回任何东西。如果返回的不是数字,那么用Integer.parse/1解析它可能会导致错误。所以我们用case的模式匹配做检查。它用起来非常方便,但是当情况变复杂时,就不太好理解了。例如,假设除了数量之外还想询问价格,那么可以做如下修改:

使用条件嵌套让代码变得难以理解。可以使用函数来改善可读性:

我们更改了checkout/0的工作方式,提高了可读性。现在让我们用传统的流程控制语句来处理地下城探险游戏中的用户输入。游戏要求玩家输入数字进行选择,这里有两种失败的情况:

● 用户可以键入“hot dog”,但它不是一个数字。

● 我们只有三个选项,而用户键入了9999。虽然它是一个数字,但不是一个有效的选项。它超出了可选值的范围。

出现这两种情况,游戏将报错。让我们做一点改进,允许用户再输入一次。在DungeonCrawl.CLI.BaseCommands模块中,编写以下函数:(www.xing528.com)

函数ask_for_index/1要求用户输入一个数字,该数字将用作索引以找到正确的选项。我们用Integer.parse/1和case检查用户输入是否是数字。用display_invalid_option/0显示错误消息,并在输入无效时请用户再次输入。如果用户输入的是数字,我们只返回该数字。现在我们需要在给定索引数字的情况下找到正确的选项。编写以下函数:

我们用Enum.at/2查找选项,如果找不到就返回nil;如果找到了,则返回choose_option。如果找不到,用运算符||显示无效消息并请玩家再试一次。

为了利用新的DungeonCrawl.CLI.BaseCommands.ask_for_option/1函数,我们要重构选择英雄角色和选择动作的代码:

重构将有利于我们开展策略试验。每种策略都将重构ask_for_option/1的内部结构。可以运行mix start查看修改后的效果:

我们使用了传统程序员都熟悉的流程控制语句,它们用起来很简单,而且这些函数总能返回一个值。但是很难将它们与其他函数结合起来,并且代码的可读性也会下降。它们只适合用于简单的问题。

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

我要反馈