Elixir学习笔记——编写文档

Elixir 将文档视为一等级别类。文档必须易于编写且易于阅读。在本指南中,您将学习如何在 Elixir 中编写文档,涵盖模块属性、样式实践和文档测试等结构。

Markdown

Elixir 文档是使用 Markdown 编写的。网上有很多关于 Markdown 的指南,我们推荐 GitHub 上的指南作为入门指南:基本写作和格式化语法

模块属性

Elixir 中的文档通常附加到模块属性中。让我们看一个例子:

@moduledoc 属性用于向模块添加文档。@doc 用于函数之前,为其提供文档。除了上述属性之外,@typedoc 还可用于将文档附加到作为 typespecs 一部分定义的类型,我们将在后面进行探讨。Elixir 还允许将元数据附加到文档中,方法是将关键字列表传递给 @doc 和朋友。

函数参数

在记录函数时,编译器会推断参数名称。例如:

编译器会将此参数推断为 map。有时推断结果可能不太理想,尤其是当函数包含多个子句,且每次参数都匹配不同的值时。您可以在实现之前的任何时刻仅声明函数头,从而为文档指定正确的名称:

文档元数据

Elixir 允许开发人员将任意元数据附加到文档中。这是通过将关键字列表传递给相关属性(例如 @moduledoc、@typedoc 和 @doc)来完成的。常用的元数据是 :since,它注释了在哪个版本中添加了特定模块、函数、类型或回调,如上例所示。

另一个常见的元数据是 :deprecated,它会在文档中发出警告,解释不鼓励使用它:

请注意,当开发人员调用函数时,:deprecated 键不会发出警告。如果您希望代码也发出警告,则可以使用 @deprecated 属性:

元数据可以有任何键。文档工具通常使用元数据向读者提供更多数据并丰富用户体验。

建议

编写文档时:

1. 保持文档的第一段简洁明了,通常只有一行。ExDoc 等工具使用第一行生成摘要。
2. 使用模块的全名引用模块。
3.Markdown 使用反引号 (`) 来引用代码。Elixir 在此基础上构建,在引用模块或函数名称时自动生成链接。因此,请始终使用完整的模块名称。如果您有一个名为 MyApp.Hello 的模块,请始终将其引用为 `MyApp.Hello`,而不要引用为 `Hello`。
4. 如果函数是本地的,则按名称和参数引用函数,例如 `world/1`;如果指向外部模块,则按模块、名称和参数引用函数:`MyApp.Hello.world/1`。
5. 通过添加前缀 c: 来引用 @callback,例如 `c:world/1`。
6. 通过添加前缀 t: 来引用 @type,例如 `t:values/0`。
7. 使用第二级 Markdown 标题 ## 开始新章节。第一级标题保留用于模块和函数名称。
8. 将文档放在多子句函数的第一个子句之前。文档始终按函数和元数而不是按子句进行。
9. 使用文档元数据中的 :since 键进行注释,只要有新函数或模块添加到您的 API 中即可。

Doctests

我们建议开发人员将示例包含在他们的文档中,通常放在他们自己的 ## 示例标题下。为了确保示例不会过时,Elixir 的测试框架 (ExUnit) 提供了一项名为 doctests 的功能,允许开发人员测试他们文档中的示例。Doctests 的工作原理是从文档中解析出以 iex> 开头的代码示例。您可以在 ExUnit.DocTest 上阅读有关它们的更多信息。

文档 != 代码注释

Elixir 将文档和代码注释视为不同的概念。文档是您与应用程序编程接口 (API) 用户之间的明确的说明书,无论是第三方开发人员、同事还是您未来的自己。如果模块和函数是 API 的一部分,则必须始终对其进行文档化。

代码注释面向阅读代码的开发人员。它们可用于标记改进、留下注释(例如,为什么由于库中的错误而不得不求助于解决方法)等。它们与源代码相关联:您可以完全重写函数并删除所有现有代码注释,并且它将继续保持相同的行为,而不会改变其行为或文档。

由于私有函数无法从外部访问,因此如果私有函数具有 @doc 属性,Elixir 会发出警告并丢弃其内容。但是,您可以像任何其他代码一样向私有函数添加代码注释,我们建议开发人员在他们认为这会为此类代码的读者和维护者添加相关信息时这样做。

总而言之,文档是与 API 用户的说明书,这些用户不一定有权访问源代码,而代码注释则适用于直接与源代码交互的人。通过区分这两个概念,您可以了解和表达有关软件的不同保证。

隐藏内部模块和函数

除了库作为其公共接口的一部分提供的模块和函数之外,库还可以实现不属于其 API 的重要功能。虽然这些模块和函数可以访问,但它们是库内部的,因此不应该为最终用户提供文档。

Elixir 允许开发人员通过设置 @doc false 来隐藏特定函数,或设置 @moduledoc false 来隐藏整个模块,从而方便地隐藏文档中的模块和函数。如果模块被隐藏,您甚至可以记录模块中的函数,但模块本身不会在文档中列出:

如果您不想隐藏整个模块,您可以单独隐藏函数:

但是,请记住 @moduledoc false 或 @doc false 不会将函数设为私有。上面的函数仍然可以作为 MyApp.Sample.add(1, 2) 调用。不仅如此,如果导入了 MyApp.Sample,add/2 函数也将导入到调用者中。出于这些原因,在向函数添加 @doc false 时要小心,而是使用以下两个选项之一:

1.将未记录的函数移动到带有 @moduledoc false 的模块,如 MyApp.Hidden,确保函数不会被意外暴露或导入。请记住,您可以使用 @moduledoc false 隐藏整个模块,同时仍使用 @doc 记录每个函数。工具仍将忽略该模块。

2.函数名称以一个或两个下划线开头,例如 __add__/2。以下划线开头的函数会自动被视为隐藏,但您也可以明确添加 @doc false。编译器不会导入带有前导下划线的函数,它们会向阅读代码的任何人提示其预期的私有用途。

Code.fetch_docs/1

Elixir 将文档存储在字节码中预定义的块内。加载模块时不会将文档加载到内存中,而是可以使用 Code.fetch_docs/1 函数从磁盘中的字节码中读取文档。缺点是,内存中定义的模块(例如 IEx 中定义的模块)无法访问其文档,因为它们不会将其字节码写入磁盘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/717276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

根据配置的参数规格生成商品SKU

参数规格如下&#xff1a; let specParam [[红色,绿色,白色,黄色], [大,小]]js部分&#xff1a; let getSpecParamCom (specData, index) > {for (let i 0; i < specData[index].length; i) {tempResult[index] specData[index][i];if (index ! specData.length - …

鸿蒙原生App开发之:套用混合app开发思路

2024年&#xff0c;似乎华为迎来了新的企业机遇--鸿蒙独立操作系统。 受到全球国际形势的影响&#xff0c;加之第四次科技革命&#xff08;AI革命&#xff09;冷不丁的出现&#xff0c;在他国AI技术领先的前提下&#xff0c;中国自主研发的独立操作系统再次提上新的战略高度。…

Javaweb08-JDBC数据库连接技术

JDBC数据库连接技术 **原理&#xff1a;**JDBC在应用程序与数据库之间起到了一个桥梁作用&#xff0c;当应用程序使用JDBC访问特定的数据库时&#xff0c;需要通过不同数据库驱动与不同的数据库进行连接&#xff0c;连接后即可对数据库进行相应的操作。 一.Jdbc API 1.Driver…

基于Itô扩散过程的交易策略偏微分方程matlab求解与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于It扩散过程的交易策略偏微分方程,提出了一种确定It扩散过程。通过根据的第一次通过时间来确定问题在这个过程中&#xff0c;我们推导出交易长度的分布函数和密…

Guava-EventBus 源码解析

EventBus 采用发布订阅者模式的实现方式&#xff0c;它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化&#xff0c;观察者模式都比较熟悉&#xff0c;这里会简单介绍一下&#xff0c;重点介绍的是如何泛化的进行方法的注册以及…

网线不通?瞅瞅这里----关于交叉网线的原理。

最近搞了个项目&#xff0c;UDP对接UDP&#xff0c;死活对接不上。 最后发现是交叉网线的事情&#xff0c;在此记录交叉网线的原理。 先说结论&#xff1a;不同设备用直连&#xff0c;相同设备用交叉网线 细说说 1.原理 网线的原理实际就是TX与RX对接。 正常一个设备同时有…

关于使用命令行打开wps word文件

前言 在学习python-docx时&#xff0c;想在完成运行时使用命令行打开生成的docx文件。 总结 在经过尝试后&#xff0c;得出以下代码&#xff1a; commandrstart "C:\Users\86136\AppData\Local\Kingsoft\WPS Office\12.1.0.16929\office6\wps.exe" "./result…

智能室内空气质量监测预警系统小程序设计说明书

智能室内空气质量监测预警系统小程序设计说明书 一、应用功能与系统设计 &#xff08;一&#xff09; 应用功能 该小程序设计的目的是为了配合环境监测吸顶灯,Mini空气监测仪等硬件设备实时数据展示与远程设备控制等功能&#xff0c;系统框架图如图1-1所示。用户可以从小程序…

生活好物:日常更精彩

我们的日用杂货店&#xff0c;是生活美学的聚集地。这里汇聚了各式各样的生活用品&#xff0c;每一件都蕴含着对生活的热爱与追求。 走进我们的日用杂货店&#xff0c;仿佛打开了一个充满生活气息的宝藏盒。从厨房的锅碗瓢盆&#xff0c;到浴室的洗漱用品&#xff0c;再到客厅的…

Excel和Word等工具小技能分享汇编(一)

这里汇集刘小生前期微信公众号分享的Excel和Word等工具小技能&#xff0c;为方便大家查看学习&#xff0c;刘小生对其进行分类整理&#xff0c;后期也会不定期整理更新&#xff0c;如有想学习交流或其他小技巧需求&#xff0c;欢迎留言&#xff0c;我们一起学习进步&#xff01…

免费 逼真:快手“可灵”后又一Sora级选手登场

就在今日&#xff0c;英伟达投资的旧金山初创公司 Luma AI 打出一手王牌&#xff0c;推出新一代 AI 视频生成模型 Dream Machine&#xff0c;可以文生视频&#xff0c;图生视频&#xff0c;人人免费可用。同时&#xff0c;Luma AI 称 Dream Machine 可以从文本和图像生成“高质…

【会议征稿】第五届物联网、人工智能与机械自动化国际学术会议 (IoTAIMA 2024,7月19-21)

由浙江工业大学主办&#xff0c;第五届物联网、人工智能与机械自动化国际学术会议 (IoTAIMA 2024) 将于2024年7月19-21日在浙江杭州召开。 会议旨在为从事物联网、人工智能与机械自动化的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xff0c;了解学…

【SXF2024笔试】

编程题 1. 最长不重复子数组2. 编辑任务所需的最短时间3. 主机连通所需的最短跳数4. 十进制数字的汉诺塔编码 1. 最长不重复子数组 2. 编辑任务所需的最短时间 3. 主机连通所需的最短跳数 4. 十进制数字的汉诺塔编码

STM32在进入main函数之前的准备工作

在大部分嵌入式系统中&#xff0c;在进入main函数之前都需要执行一个系统 初始化序列。这里所说的初始化序列特指的是软件运行环境的初始化。 上图是系统开始运行后&#xff0c;在进入main函数之前的默认初始化序列。从图中可以看出&#xff0c;在左侧有2个函数&#xff1a;__m…

各大APP自动化运行插件开发需要用到的源代码有哪些?

在当今数字化时代&#xff0c;自动化运行插件的开发在各大APP中扮演着至关重要的角色&#xff0c;这些插件不仅提升了APP的功能性和效率&#xff0c;同时也为用户带来了更加便捷的使用体验。 在开发这些自动化运行插件的过程中&#xff0c;源代码的选择与使用显得尤为关键&…

RocketMQ快速入门:集成java客户端实现各类消息发送|异步、同步、顺序、单向、延迟、事务(五)附带源码

0. 引言 前面的章节中&#xff0c;我们已经针对rocketmq的基本概念和消息发送、消费流程进行了讲解&#xff0c;但实际在开发中如何实现rocketmq的接入、实现消息发送、消费还没有落实&#xff0c;那么今天&#xff0c;我们继续来学习如何基于java client集成rocketMQ 1. 集成…

Vue47-修改默认配置webpack.config.js文件

main.js是脚手架项目的入口文件&#xff0c;系统运行时&#xff0c;默认去找src下的main.js文件。这是webpack通过配置文件&#xff1a;webpack.config.js配置的。 脚手架把所有重要的配置文件都隐藏了&#xff0c;方式被开发者修改。 一、查看被隐藏的webpack配置 1-1、webpa…

python基础语法 002 - 3 数据运算

1 运算符 1.1 算术运算符 -*/ 1.1.1 除法&#xff1a;会类型转换、被除数不能为0 #算术运算符a 1 2 print(a) b a - 1 print(b) c b 6 print(c)# 为什么除法得不到整数&#xff1f; #除法可能遇到除不尽 #使用了除法数据类型会转化为浮点数 d c / 2 print(d) print(typ…

SAP 在过账的时候系统提示:被合并的公司 XXXX 和 ‘ ‘ 是不同的解决办法

最近用户反馈在STO的业务模式中交货单过账的时候&#xff0c;报错没有办法过账。查看了一下报错的信息提示&#xff1a;被合并的公司 和1300是不同的 如下图所示&#xff1a; 消息号是F5080 首先根据SAP的消息号找了一下NOTE&#xff0c;发现2091823有详细的说。 主要是财务…

硕士毕业论文《基于磁纹理的磁化动力学研究》

前言 本文是博主的硕士毕业论文&#xff0c;应该也是“自旋电子学&#xff08;微磁学&#xff09;”博客专栏的最后一篇博客&#xff0c;该毕业论文预设排版的PDF版本见下载链接&#xff1a;https://download.csdn.net/download/qq_43572058/89447526。若该博客专栏对读者您的…