推荐的方法是什么,可以在药剂中制作相当于"const array"?



在Elixir语言中制作具有随机访问的"const数组"的规范方法是什么?(例如,用于CRC计算或AES标准框)

从 Erlang 的背景来看,我假设"数组"本身应该是一个元组,因为通过 elem/2/element/2 访问似乎是 O(1)(erts/emulator/beam/bif.c 中的函数BIF_RETTYPE element_2(BIF_ALIST_2))。

但是存储范围呢,因为Erlang/Elixir没有全局变量?我的鼻子说@module_attribute会是那个地方,但我不太确定@attributes

何时何地扩张。

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

《长生不老药@module_attribute是解决了这个问题,还是把它当作花哨的宏观扩张?我已经阅读了有关模块属性的官方文档,但我仍然感到困惑。

从文档中看,Elixir模块属性的工作方式类似于Erlang模块属性,即它们是可以被Module:module_info(Attributes)检索的模块元数据。 这最终进入了 beam_load.c 中的函数attributes_for_module ,据我所知,每次访问数据时都会复制数据。 因此,模块属性不适合大量经常访问的数据。

相反,我会编写一个不带参数的函数,只返回元组。 元组将被编译到模块的常量池中,因此每次调用函数时都不会重建它;该函数实质上返回对常量数据的引用。 这在 Erlang 效率指南的"常量池"部分中进行了描述。

最新更新