假设我有两个文件:
foo.re
bar.re
说我现在有,在顶部bar.re
open MyProject.Foo;
这无法编译:
This module is not a structure; it has type
(module MyProject.Foo)
如果我重新运行编译,一切正常
如果我将该行更改为open Foo;
一切编译正常。
为什么我要观察这种行为?
假设我有两个文件:
foo.re
bar.re
说我现在有,在顶部bar.re
open MyProject.Foo;
这无法编译:
This module is not a structure; it has type
(module MyProject.Foo)
如果我重新运行编译,一切正常
如果我将该行更改为open Foo;
一切编译正常。
为什么我要观察这种行为?
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 的书的基本模块部分