完整的命名空间需要重新编译

时间:2018-07-15 13:04:18

标签: namespaces ocaml reason bucklescript

说我有两个文件:

foo.re
bar.re

说我现在在bar.re顶部

open MyProject.Foo;

无法通过以下方式进行编译:

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

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

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

为什么我要观察这种行为?

1 个答案:

答案 0 :(得分:0)

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

Foo.re
Bar.re

我们还假设我们在Foo调用栏中定义了一个函数,并在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部分