【问题标题】:Why does Erlang offer both `import` for modules and `include` for headers?为什么 Erlang 既为模块提供了“import”,又为头文件提供了“include”?
【发布时间】:2021-11-03 00:26:17
【问题描述】:

Erlang 的-import() 指令允许您从其他模块导入代码。它的include() 指令允许您从标头导入代码。为什么有理由偏爱其中之一?

我的预感是,当您不想对文件进行限定时,标头适用于简短、易于编译的代码,例如记录定义。

Learn You Some Erlang 声明[1] “Erlang 头文件与它们的 C 对应部分非常相似:它们只不过是添加到模块中的代码的 sn-p,就好像它是在模块中编写的一样第一名。”因此,包含似乎会导致编译器在不同模块之间重复工作。头文件似乎是强制性模块系统之上的可选复杂功能。那么我为什么要使用头文件呢?

[1]https://learnyousomeerlang.com/a-short-visit-to-common-data-structures

【问题讨论】:

    标签: import erlang header-files


    【解决方案1】:

    import 有助于构建封装,而include 是一种预处理(这意味着代码在通过编译器之前将成为单元的一部分)。

    import 导致两个模块之间存在依赖关系,这意味着模块 A 导入模块 B 具有 B 作为依赖关系...而 include 是扩展的,这意味着模块具有 包含一些代码,而该代码模块本身的一部分,这就是头文件的作用。

    module(s) 和header(s) 是两个语义不同的东西,用于不同的目的。使用模块,我们可以通过使用export(s) 来构建抽象,通过不导出它们来限制事物,从其他模块导入(但默认情况下不导出),重新导出导入的东西等等。所以当我们import 东西,我们可以调用其他模块中的函数,但只能调用其他模块中导出的函数。但是,header 文件并非如此。 header 文件中的所有内容都成为包含它们的模块的一部分。头文件中没有导出/导入的感觉。头文件对于编写和分发定义非常有用,否则在大型程序的情况下可能会导致冗余。

    所以本质上它们是两个不同的东西,所以我们可以使用 2 个不同的关键字。所以不要偏爱一个。学习他们两个,因为我们需要他们两个。

    【讨论】:

    • 如果您认为答案是not useful,请发表评论。
    【解决方案2】:

    Erlang 的-import 只允许您在没有Module 的情况下调用导入的函数。它会损害易读性并且不应该使用:您需要检查 import 指令以了解函数是本地的还是模块外部的。

    使用头文件,您可以获得与 C 相同的功能,您可以使用它们来共享 -record 定义而不是使用类似 dto 的模块 (1),您可以使用它们将 -defines 包含到使用相同的宏 (2)。

    1:

    -record(position, {x, y}).
    

    假设您在整个代码中都有#position{},而不是在任何地方定义记录并在记录定义更改时更新所有副本,而是使用标题(或具有不透明类型的 dto 模块,但这是另一个问题)。
    并且希望您记得更新所有副本,否则会出现混乱。

    2:

    -define(ENUM01, enum01).
    -define(DEFAULT_TIMEOUT, 1000).
    

    不要在任何地方都使用enum011000,这很容易出错并且如果需要更改它们需要多次更新,而是在标题中定义它们并将它们用作?ENUM01?DEFAULT_TIMEOUT

    或者您可以在测试时更加彻底:

    -ifdef(TEST).
    -define(assert(A), true = A).
    -else
    -define(assert(A), A).
    -endif.
    

    或者您可以包含一些有用的信息:

    -define(LOG(Level, X), logger:log(Level, X, #{line => ?LINE}).
    

    【讨论】:

      【解决方案3】:

      Erlang 标准库使用头文件来提供向代码添加元数据的能力。

      例如,EUnit 功能:

      -include_lib("eunit/include/eunit.hrl"). 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 2023-03-19
        • 2014-07-09
        • 2018-10-14
        • 2011-10-07
        • 1970-01-01
        • 2012-06-02
        相关资源
        最近更新 更多