我们创建的具名函数就像Elixir内置的函数一样工作。我们可以使用ModuleName.name_of_the_function的模式调用任何具名函数。如果你觉得每次都写ModuleName有些累赘,可以用import指令精简代码。这样就不需要在每个函数名前面加上模块的名称,就像Kernel函数一样。Elixir默认将Kernel里所有的工具导入当前编程环境中。
让我们创建一个模块来看看如何使用import指令,该模块将任务列表存储在文件中。进行文件操作需要用到File模块。[7]创建一个task_list.ex文件:
TaskList模块的工作是添加任务并列出它们。add函数负责在文件中创建任务(每一行记录一个任务名称)。show_list函数读取文件内容。暂时不要管show_list的输出,也不必担心读取不存在的文件可能发生错误。我们先了解什么是模块属性,以及如何导入文件函数。
@file_name是一个模块属性。模块属性可用作注释、临时存储、常量。这里我们将模块属性用作常量。它是一种特殊类型的变量,可在整个模块中使用。如果我们想更改文件名,只需要修改一个地方就能生效。(www.xing528.com)
导入模块函数后,我们每次调用write函数和read函数时,前面就不必再加上File了。让我们将import指令添加到TaskList模块里。
import指令中函数名后的数字称为函数元数(arity)。元数是函数接收参数的数量。在Elixir文档中,函数元数通常以这种方式表示:name_of_the_function/arity。例如,File.read/1或File.write/3。导入具名函数时,必须始终带上它的名字和它的形参数量。
使用import后,就不需要再写函数的全名了。这样做虽然带来了方便,但也隐藏了read函数和write函数的来源。如果不使用import的only选项,将隐式导入模块的所有函数。在导入多个模块的情况下,这样做会导致很难发现这些函数来自哪个模块。合适的做法是,在大多数情况下输入函数的全名,在导入函数时尽量使用only选项,只有在确定不会引起混淆时才使用隐式导入。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。