【问题标题】:What is recommended way to make equivalent of "const array" in Elixir?在 Elixir 中制作等效于“const array”的推荐方法是什么?
【发布时间】:2025-11-26 01:20:06
【问题描述】:

在 Elixir 语言中创建具有随机访问的“const 数组”的规范方法是什么? (例如用于 CRC 计算或 AES s-box 的一种)

从 Erlang 背景我假设,“数组”本身应该是一个 元组,因为通过 elem/2 / element/2 访问似乎是 O(1)(@ 中的函数 BIF_RETTYPE element_2(BIF_ALIST_2) 987654325@)。

但是存储范围呢,因为 Erlang/Elixir 没有全局变量?我的鼻子说@module_attribute 会是这个地方,但我不太确定@attributes 的扩展位置和时间。

有一个已知的 Erlang 问题:当你在模块中 -define(LARGE_LIST,[...]) 然后在函数中使用 ?LARGE_LIST 时。该值在每次函数调用时重新构造。解决方案是在应用程序启动时构建一次,并将其作为参数之一传递给需要它的函数。

Elixir 的@module_attribute 是否解决了这个问题,还是被视为花哨的宏扩展?我已经阅读了module attributes 上的官方文档,但我仍然感到困惑。

【问题讨论】:

    标签: arrays erlang constants elixir


    【解决方案1】:

    从文档来看,Elixir 模块属性似乎像 Erlang 模块属性一样工作,即它们是模块元数据,可以通过 Module:module_info(Attributes) 检索。这最终进入beam_load.c 中的函数attributes_for_module,据我所知,每次访问时都会复制数据。因此,模块属性不适用于大量频繁访问的数据。

    相反,我会编写一个不带参数并且只返回元组的函数。元组将被编译到模块的常量池中,因此不会在每次调用函数时都重新构建;该函数本质上返回对常量数据的引用。这在the Erlang Efficiency Guide 的“常量池”部分中进行了描述。

    【讨论】:

      最近更新 更多