例如,OCaml中的include,require和open有什么区别?
包括:include Ppx_core
开放:open Core.Std
要求:#require "compiler-libs.common"
和使用:#use "topfind"
例如,OCaml中的include,require和open有什么区别?
包括:include Ppx_core
开放:open Core.Std
要求:#require "compiler-libs.common"
和使用:#use "topfind"
include
re-exports在当前的所述模块的部件海峡ucture:您所在的模块将包含Ppx_core
中的所有定义。open
使打字环境中的模块directly accessible的组件。您可以输入element
而不是输入Core.Std.element
。#require
是一个Topfind命令,用于查找库并加载它,使其模块可供您访问。#use
表现得好像copying a full file直接进入您的顶层。请注意,#
关键字不是OCaml语言的一部分,但是是顶层命令:如果您尝试编译文件,它们将不起作用。
模块定义中的include Module.Name
语句将包含来自名为Module.Name
的模块的所有定义。这些定义将被大致包括在复制粘贴中。如果include Module.Name
发生在模块类型定义(也称为签名定义)内部,Module.Name
应该是有效的(编译器已知的)模块类型。它将包含模块类型的定义(不包括任何类型共享约束)。
的open Module.Name
语句都模块实现与模块的签名出现,让你参考的定义(值,类型,子模块)一Module.Name
,而无需使用一个完全合格的命名,即,使用短名称没有Module.Name
前缀。
#require
声明根本不是声明,也不是OCaml语法的一部分。它是OCaml顶层的特殊指令 - 交互式循环。与ipython相同的是它自己的指令。 require
指令将加载指定的包及其所有依赖项。此外,该指令不是标准OCaml顶层分发的一部分,而是由作为ocamlfind工具包一部分的topfind
脚本添加的。 #use
指令用于加载和评估脚本。例如,#use "topfind"
将加载并评估OCaml标准库文件夹中的topfind
脚本。该脚本将注册require
指令。还有#load
和#load_rec
指令,它们工作在更精细的级别上,而不是包 - 这些指令是加载库的入口。