【问题标题】:Full namespacing requires recompilation全命名空间需要重新编译
【发布时间】:2018-07-31 06:21:43
【问题描述】:

假设我有两个文件:

foo.re
bar.re

说我现在有,在bar.re的顶部

open MyProject.Foo;

编译失败:

This module is not a structure; it has type
  (module MyProject.Foo)

如果我重新运行编译,一切正常

如果我将该行更改为 open Foo; 一切编译正常。

为什么我会观察到这种行为?

【问题讨论】:

    标签: namespaces ocaml reason bucklescript


    【解决方案1】:

    ReasonML 将每个文件视为一个模块,做法是将文件名大写所以

    Foo.re
    Bar.re
    

    假设我们在 Foo 调用 bar 中定义一个函数,在 Bar 调用 foo 中定义另一个函数。

    所以我们会:

    /* Inside Foo.re */
    let bar = string => {}
    
    /* Inside Bar.re */
    let foo = string => {} 
    

    从另一个模块,我们称为 Main.re,我们可以引用上面的。

    let myResult = Foo.bar("happy");
    let ourResult = Bar.foo("days);
    

    open Foo, Bar;
    
    let myResult = bar("happy");
    let ourResult = foo("days");
    

    所以当被问及open MyProject.Foo 时,你是在问模块MyProject 中的子模块Foo,它不存在。当然,如果您创建了MyProject.re 并在该文件中添加了一个名为Foo 的模块,那么您的open MyProject.Foo 就可以正常工作。

    更多参考资料:

    reasonML 模块所基于的底层Ocaml。 Axel Rauschmayer 关于 ReasonML 的书的Basic modules 部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多