Elixir 模块内部自引用:`__MODULE__` 与别名模式的正确用法
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本篇指南讲解 Elixir 中__MODULE__特殊字面量的工作原理与典型用法它让模块在自身内部安全、可读地引用自己尤其适合与defstruct定义的 struct 配合进行模式匹配。读完本文你将掌握__MODULE__的语义、%__MODULE__{}在模式匹配与构造 struct 时的应用以及用alias __MODULE__让代码更易读的实战写法这些技巧在日常的 Elixir / Phoenix 项目如 Ecto schema 与业务模块中会频繁出现。__MODULE__是什么Elixir 提供了一个名为__MODULE__的保留字reserved word用于在模块自身内部引用该模块。它本质上是一个在编译期求值的特殊字面量其值就是当前模块对应的原子atom。例如在SomeNamespace.MyModule模块内部__MODULE__会被展开为原子:SomeNamespace.MyModule。因为它的值是确定的、与模块名保持同步所以用它来自引用不会产生模块名写死、一旦重命名就出错的问题——模块一旦重命名__MODULE__会自动指向新名字。这一点对于命名空间嵌套较深的模块如SomeNamespace.MyModule尤其有价值你不必在模块内部反复输入完整的全限定名。典型场景用__MODULE__匹配自己的 struct文档中最典型、最实用的场景是配合 struct 使用。当一个模块定义了 struct通过defstruct它往往希望编写只接受自己这个 struct的函数这时__MODULE__就能派上用场defmodule SomeNamespace.MyModule do defstruct [:id] def do_thing(%__MODULE__{}thing) do # ... end end这里的关键是%__MODULE__{}这个模式%__MODULE__{}在编译期展开为%SomeNamespace.MyModule{}代表该模块的 struct将其作为函数参数的模式配合绑定可以实现仅当传入参数是本模块的 struct 时才匹配成功的效果——这就是 Elixir 中基于类型struct 本质上是带__struct__字段的 map的模式匹配匹配成功后thing变量即绑定为传入的整个 struct可在函数体内继续使用。这个写法在 Elixir 项目中极为常见因为它同时表达了两个意图函数期望的输入类型本模块的 struct以及函数体内需要访问该 struct 的完整数据。相关的 struct 定义与使用细节可以参阅仓库中 requiring-keys-for-structs.mdenforce_keys强制必填键与 expose-internal-representation.mdElixir 元编程与 AST 机制。用alias __MODULE__提升可读性虽然__MODULE__写起来方便但当它在代码中出现次数较多时例如多个函数都做 struct 模式匹配满屏的__MODULE__会让代码略显晦涩。文档给出的第二个写法是用别名把它翻译成一个更人读的名字defmodule SomeNamespace.MyModule do alias __MODULE__, as: MyModule defstruct [:id] def do_thing(%MyModule{}thing) do # ... end end要点解析alias __MODULE__, as: MyModule把当前模块自身起了一个别名MyModule其效果等同于给SomeNamespace.MyModule起别名但引用来源是动态的__MODULE__所以仍然与模块实际名字保持同步之后模块内部凡是需要引用自己的地方如%MyModule{}、调用MyModule.some_function()都可以用这个短名代码更接近自然语言读起来也更清爽这种写法尤其适合模块名较长、嵌套较深SomeNamespace.MyModule这类或 struct 模式匹配出现频率高的场景。两种写法在功能上是等价的选择哪一种主要取决于团队风格与可读性偏好写法优点适合场景%__MODULE__{}零额外声明、语义直白、永远与模块名同步出现次数少、希望保持最简alias __MODULE__, as: MyModule别名短而可读、书写更省力模块名长、struct 匹配频繁结合仓库理解 struct 模式匹配的上下文__MODULE__的价值需要在 struct 与模式匹配的语境中才能完全体现。仓库中的相关笔记可以帮你串起这条知识链passing-around-and-using-modules.md 展示了模块即原子这一语言事实——模块在编译期绑定到一个原子因此模块名可以在代码中被传递和调用。理解了这一点就明白了%__MODULE__{}中的__MODULE__本质上也是在编译期解析为一个原子的原因requiring-keys-for-structs.md 展示了defstruct与enforce_keys的组合用法——struct 的键可以是可选的也可以被强制必填当 struct 键较多时用%__MODULE__{}或%MyModule{}做整体模式匹配比逐个匹配键要稳健得多pattern-matching-in-anonymous-functions.md 说明模式匹配在 Elixir 中无处不在——包括匿名函数参数、fn多子句等%__MODULE__{}正是把模式匹配与类型约束结合在一起的经典实践。例如结合enforce_keys定义一个必填键的 struct并用别名风格自引用defmodule SomeNamespace.User do alias __MODULE__, as: User enforce_keys [:id] defstruct [:id, :name] def describe(%User{id: id, name: name}) when is_binary(name) do User ##{id}: #{name} end end这里%User{}即%__MODULE__{}同时用于两个目的在函数参数中约束输入必须是SomeNamespace.User的 struct并通过模式匹配解构出id与name字段。使用注意点基于__MODULE__的编译期语义有几个实际开发中值得留意的点它只在模块内部有效__MODULE__是当前正在定义的模块在模块外部使用它没有意义外部应该直接用模块全名多文件重命名安全因为__MODULE__在编译期由编译器展开为当前模块的原子模块改名后内部引用自动更新无需手工同步字符串别名方案同样继承这一特性可与宏结合__MODULE__也常用于模块内的宏或attributes场景例如在模块属性中记录当前模块名这也是自引用思想的延伸defstruct与__MODULE__的天然契合defstruct生成的 struct 结构体正是以模块名作为其__struct__标识所以在模块内部引用自己的 struct用__MODULE__是最自然、零硬编码的选择。小结__MODULE__是 Elixir 为模块自引用提供的编译期安全机制最常见的应用是配合defstruct的%__MODULE__{}模式匹配当可读性优先时可用alias __MODULE__, as: MyModule引入短别名在不牺牲与模块名同步的前提下让代码更接近自然语言。建议在你的模块中优先采用alias __MODULE__, as: ...风格并辅以仓库中 requiring-keys-for-structs.md、passing-around-and-using-modules.md 等笔记理解 struct 与模块机制的完整上下文。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载上一篇iOS动画跨平台开发Spring库与React Native对比下一篇libphonenumber线程安全分析多线程环境下的元数据访问控制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

当 AI agent 群集出现时,银行能跟上吗?

当 AI agent 群集出现时,银行能跟上吗?

作者:来自 Elastic Karen Mcdermott 随着自主 AI 重塑网络风险,金融机构需要具备可视性和上下文,才能检测异常行为并以机器速度做出响应。 AI agent 正在改变的不只是金融服务公司的运营方式,也在改变网络风险的速度和规模。 近期…

2026/10/5 14:01:41 阅读更多 →
JavaScript下拉框change事件监听实战:从onchange到事件委托

JavaScript下拉框change事件监听实战:从onchange到事件委托

上周我在一个老项目里加功能&#xff0c;页面上有个城市下拉框&#xff0c;用户每换一个城市&#xff0c;旁边的价格区间就要跟着变。需求很简单&#xff0c;我下意识就在<select>标签里写了onchange"xxx(this)"&#xff0c;结果点了半天没反应。查来查去&…

2026/10/5 11:32:12 阅读更多 →
如何快速上手vgpu:从零渲染你的第一个着色器动画,5分钟入门教程

如何快速上手vgpu:从零渲染你的第一个着色器动画,5分钟入门教程

如何快速上手vgpu&#xff1a;从零渲染你的第一个着色器动画&#xff0c;5分钟入门教程 【免费下载链接】vgpu Modular cross-runtime WebGPU library for shaders, 3D scenes, GPU tensors, neural networks, and math viz 项目地址: https://gitcode.com/gh_mirrors/vgpu/v…

2026/10/5 10:32:27 阅读更多 →

最新新闻

遥感生态指数RSEI模型原理与GEE实现全解析

遥感生态指数RSEI模型原理与GEE实现全解析

这些年做生态环境遥感评估&#xff0c;我周围很多同行一开始都习惯用NDVI单指标来看一个区域的生态状况&#xff0c;但说实话&#xff0c;单看绿度太片面了。一个城市周边可能有大量农田&#xff0c;NDVI很高&#xff0c;但地表温度、建筑裸土占比这些生态压力因素完全没体现出…

2026/10/5 14:01:23 阅读更多 →
CH340N Type-C转串口模块设计全流程:原理图到调试

CH340N Type-C转串口模块设计全流程:原理图到调试

CH340N这颗芯片&#xff0c;凡是玩单片机、折腾串口调试的人&#xff0c;大概率都见过。最近两年USB Type-C接口普及之后&#xff0c;基于CH340N做的Type-C转TTL小模块越来越多&#xff0c;体积比过去CH340G加晶振的方案小了一大截&#xff0c;插上电脑就能识别成一个串口&…

2026/10/5 14:01:22 阅读更多 →
蓝桥杯P8627饮料换购:从模拟循环到数学公式的解法剖析

蓝桥杯P8627饮料换购:从模拟循环到数学公式的解法剖析

看到 P8627 [蓝桥杯 2015 省 A] 饮料换购&#xff0c;熟悉蓝桥杯的朋友应该会心一笑——这是省赛里少见的“送分题”。但别急着得意&#xff0c;我身边很多同学在这道题上翻过车&#xff1a;有人把简单模拟写成了死循环&#xff0c;有人算出了错误的总瓶数&#xff0c;还有人明…

2026/10/5 14:01:22 阅读更多 →
基于Hadoop+Spark+Hive与TensorFlow的招聘薪资预测及岗位推荐系统实战

基于Hadoop+Spark+Hive与TensorFlow的招聘薪资预测及岗位推荐系统实战

每年到了毕业设计的高峰期&#xff0c;总能看到一批批类似“薪资预测系统”“招聘岗位推荐”的题目涌进来。这个方向之所以长盛不衰&#xff0c;本质上是踩中了当下两个最热的赛道&#xff1a;大数据处理和机器学习应用。你只要走进任何一个招聘软件的后台&#xff0c;就会发现…

2026/10/5 14:01:22 阅读更多 →
Supacode Worktree工作流实战:如何让多个AI编码Agent并行开发互不冲突

Supacode Worktree工作流实战:如何让多个AI编码Agent并行开发互不冲突

Supacode Worktree工作流实战&#xff1a;如何让多个AI编码Agent并行开发互不冲突 【免费下载链接】supacode worktree coding agents command center. 项目地址: https://gitcode.com/gh_mirrors/su/supacode Supacode 是一款 macOS 原生的 AI 编码 Agent 并行指挥中心…

2026/10/5 14:01:21 阅读更多 →
3D打印Pre-IPO估值30亿背后:设备、材料与应用生态的决胜点

3D打印Pre-IPO估值30亿背后:设备、材料与应用生态的决胜点

刚刷到这条融资消息的时候&#xff0c;我第一反应不是“哇&#xff0c;30亿”&#xff0c;而是“Pre-IPO”这三个字比数字本身更有意思。苏州&#xff0c;3D打印&#xff0c;投前估值30亿&#xff0c;这几个词叠在一起&#xff0c;基本能确定一件事&#xff1a;这个行业已经从“…

2026/10/5 14:00:21 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起&#xff1a;它到底在解决什么问题如果你最近在折腾 AI 编程工具&#xff0c;尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手&#xff0c;那你大概率绕不开一个词——plugins。这个词本身不新鲜&#xff0c;从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →