微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您可以通过一个 require 语句来要求一整套模块或类吗?

如何解决您可以通过一个 require 语句来要求一整套模块或类吗?

我正在尝试使用一个 require 语句导入许多类。这可能吗?

我有以下文件结构:

repl-file-structure

在我的 main.cr 中,我有以下内容

require "./module-a"
require "./module-b"
require "./module-c"

ModuleA.who_am_i()

ModuleB.who_am_i()

instanceB = ClassB.new
instanceB.who_am_i()

ModuleC.who_am_i()

instanceC = ClassC.new
instanceC.who_am_i()

当我运行这个程序时,我得到以下信息:

Showing last frame. Use --error-trace for full trace.

In main.cr:9:13

 9 | instanceB = ClassB.new
                 ^
Error: undefined constant ClassB

Did you mean 'Class'?
exit status 1

ClassB文件 module-b/module-b.cr 中定义。解决方法是将 require 语句更改为 ./module-b/*。对于 module-c,我在它自己的文件中定义了 ClassC。有没有办法只用 1 个 require 语句导入所有类?还是我必须指定我想要的每个类?

我在想是否有一个 javascript 等价物,我在一个文件夹中定义了 1 个 index.js 文件,该文件执行多个 modules.export 语句以导出所有函数和类。

以下 repl 描述了整个设置...

Repl.it Link

感谢您的帮助!

解决方法

感谢 Discord 上的 Crystal Programming 社区(值得加入 - 感谢来自服务器的 Blacksmoke16 和 jack arthur),我想出了这个解决方案:

ma​​in.cr

require "./**"

ModuleA.who_am_i()

ModuleB.who_am_i()

instanceB = ModuleB::ClassB.new
instanceB.who_am_i()

ModuleC.who_am_i()

instanceC = ModuleC::ClassC.new
instanceC.who_am_i()

尽管它不如 Node 优雅,但它可以胜任。

感谢@matthewm(在 Discord 服务器上):

此解决方案要求所有文件和嵌套文件开始 从目录中,需要的文件所在的目录。你的一个问题 可能会遇到这样的情况,那就是你默认了 需要任何晶体选择的顺序。如果你有一个 module_c 取决于 module_b 但你确实需要 ./**,Crystal 可能会尝试 在module_b之前需要module_c,它会失败,所以你需要 要么总是直接以正确的顺序要求文件,要么 在一次要求所有内容之前单独要求文件:

require "./module_b"
require "./**" # files in here depend on module_b to be loaded first

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。