OCaml 模块中的私有值?
Private values in OCaml module?
是否可以有一个 let
绑定(无论是函数、值等)对其模块 private 并且从外部不可见?
假设我们有 A.ml
:
let exported = 1
let local = 2
我只希望 exported
可以从其他模块访问。 B.ml
:
let a = A.exported
let error = A.local (* This should error *)
类似于 let%private
在 Reason 中的作用。
这就是签名和 mli 文件背后的动机:它们允许向外部世界隐藏信息并仅公开 API 的相关部分,而不公开实施细节。在你的情况下,它看起来像
(* A.ml *)
let exported = 1
let local = 2
和
(* A.mli *)
val exported: int
那么只有 exported
在 A.ml
之外可见。
是的,这就是 module signatures and on the file level the .mli file 的目的。
简单说明一下,加一个A.mli
,然后把你要导出的定义放进去:
val exported : int
这不是惯用语,但为了完整起见:
自 4.08 以来,当 open
被扩展为接受任意模块表达式时,可以在不使用模块签名的情况下创建私有绑定:
open struct
let local = 2
end
在此之前,您必须为模块命名然后打开它,这将公开模块及其内容,尽管当然可以为它指定一个表明不应使用它的名称。
module Internal = struct
let local = 2
end
open Internal
是否可以有一个 let
绑定(无论是函数、值等)对其模块 private 并且从外部不可见?
假设我们有 A.ml
:
let exported = 1
let local = 2
我只希望 exported
可以从其他模块访问。 B.ml
:
let a = A.exported
let error = A.local (* This should error *)
类似于 let%private
在 Reason 中的作用。
这就是签名和 mli 文件背后的动机:它们允许向外部世界隐藏信息并仅公开 API 的相关部分,而不公开实施细节。在你的情况下,它看起来像
(* A.ml *)
let exported = 1
let local = 2
和
(* A.mli *)
val exported: int
那么只有 exported
在 A.ml
之外可见。
是的,这就是 module signatures and on the file level the .mli file 的目的。
简单说明一下,加一个A.mli
,然后把你要导出的定义放进去:
val exported : int
这不是惯用语,但为了完整起见:
自 4.08 以来,当 open
被扩展为接受任意模块表达式时,可以在不使用模块签名的情况下创建私有绑定:
open struct
let local = 2
end
在此之前,您必须为模块命名然后打开它,这将公开模块及其内容,尽管当然可以为它指定一个表明不应使用它的名称。
module Internal = struct
let local = 2
end
open Internal