我们已经了解了一些有用的Elixir具名函数。当我们编写应用程序时,可能想要创建自己的具名函数来表达程序逻辑。首先要考虑可以在哪里创建函数。我们可以把函数想象成装东西的盒子,这些盒子应该放在某个地方。模块是更大的盒子,可以容纳函数。不仅如此,模块里面还能容纳其他模块。有了这个特性,我们就可以灵活地组织应用程序了。
可以在IEx会话或.ex源文件中创建模块。将模块保存在文件里是个好习惯。让我们创建一个名为checkout.ex的文件。你可以将文件放在任何位置(Elixir项目的文件通常放在lib目录里,但你现在不用管这些细节;第6章会详细介绍如何构建项目)。创建文件后,我们将定义一个模块,其中包含一个函数,该函数根据税率计算产品的总成本。以下是文件内容:
接下来,我们要在文件中创建一个名为Checkout的模块。请注意,这里文件名与模块名相同,但文件名是小写。扩展名.ex代表可编译的Elixir源文件。defmodule表示开始定义模块,其后必须给出模块的名称。do标志着模块体的开始,end表示模块体结束。
可以在模块体内添加代码来调用、导入、创建函数。我们先添加一个函数。
我们添加了一个名为total_cost的函数。def表示开始定义函数,其后必须给出函数的名称。函数遵循与变量相同的命名约定。在括号内声明函数参数。do标志这函数体的开始。end表示函数体结束。在函数体内部,可以添加各种表达式。与匿名函数一样,具名函数将返回最后一个表达式的值。
请注意,模块与函数、变量的命名约定不同。模块使用大驼峰式命名法(CamelCase),即复合名称中的每个单词都以大写字母开头,例如:ShoppingCart、ProductBacklog、CharacterSheet。模块的文件名、函数名和变量名使用蛇形命名法(snake_case),即使用下划线分隔复合名称中的单词,并且单词都是小写的。例如,前面模块的文件名分别是shopping_cart.ex、product_backlog.ex、character_sheet.ex。(www.xing528.com)
使用IEx试试我们的模块。在模块文件的同一目录中打开会话:
c函数的作用是编译指定的文件并将Checkout模块提供给当前的IEx会话。然后我们可以像之前一样调用我们的模块了。另外,还可以用另一种方式定义这个函数(在单行类完成函数的定义),如下所示:
在大型程序里,应用程序模块的名称与Elixir模块的名称容易混淆。为了避免出现这种情况,应该在自定义模块的名称前面加上特定名称(用点号分隔)。这样就能保证每个模块名称的唯一性,防止命名冲突。试试看:
在IEx里试试:
让我们回顾一下。在Elixir项目里,我们将自定义模块放在与模块同名的文件中,文件名采用小写形式,且每个文件存放一个模块。模块存放在同名的目录里。例如,Ecommerce.Checkout模块存放的Ecommerce目录里,文件名是checkout.ex。采用这种简单的约定,所有模块都能找到合适的存放位置,名称和概念也得到了有效的管理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。