几乎所有的列表任务都会用到each、map、reduce、filter操作。实际上,Elixir已经内置了这些高阶函数,它们都在Enum模块里。我们编写这些函数,只是为了学习创建高阶函数。从现在开始,可以直接使用Enum模块里的所有高阶函数。打开IEx尝试以下内容:
Enum模块里有许多有用的函数,看名字就能猜出它们的用途:
函数count/1返回元素的总数,uniq/1返回没有重复元素的新列表。sum/1返回列表中所有数字的总和,member?/2检查列表中是否存在某一项,join/2将列表项组合成一个字符串。sort/2是一个高阶函数,它接受一个函数,用于比较列表中元素。Enum模块函数适用于任何符合Enumerable协议的数据类型。[1]
看一看:
映射表是符合Enumerable协议的数据类型,因此可以用Enum模块函数来处理。在对映射表结构的每次迭代中,都有一个包含两个元素的元组:一个是映射表的键,另一个是值。第6章将介绍更多有关协议的内容。(www.xing528.com)
在Enum模块中,还有一些更复杂的高阶函数,它们的参数中包含两个函数。例如,Enum.group_by/3接收两个函数,一个用于运用分组条件,另一个为分组生成值。让我们创建一个包含奖牌和对应获奖选手的列表:
现在我们想展示每一种奖牌有哪些获得者。我们需要根据奖牌类型(金牌、银牌、铜牌)进行分组,每个组包含相应选手的名字。自己编写递归函数完成这个任务并不容易,好在我们可以使用Enum.group_by/3:
我们只用一行代码就完成了任务。分组条件函数回一个值,用于对具有相同值的项进行分组。我们传递的匿名函数&(&1.medal)返回奖牌的值(:gold、:silver、:bronze)。第二个函数&(&1.player)的返回值是选手的名字,用来构建分组。通过这个简单的调用,我们构建了一个映射表,依次列出了获得每种奖牌的选手。
Enum模块中的函数在日常编程任务中很常用,因此有必要花时间进行练习。它们将大大提高你的编程效率。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。