【问题标题】: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 部分