我有一个Map模块,我希望它在一个类的范围内。如何在整个班级中打开该模块?
这是我的猜测,但这是错误的:
module My_map = struct
module Map = ...
end
class my_object =
object
open My_map.Map
method ...
end
但这不起作用。有没有办法在类级别而不是在每个方法中打开模块?
具体来说,我遇到的问题是:
module Data = My_map.Map.Make(String)
然而,当我尝试访问我添加到My_map.Map.Make的函数(在类中)时,我收到编译器错误,说它们不存在。
答案 0 :(得分:2)
我刚刚查看了OCaml语法,但我没有看到一个地方为整个类定义打开一个模块。
您可以说
之类的内容class c =
let x = 4 in
object method m = x end
因此可以说:
class c =
let open My_map.Map in
object method m = ... end
然而语法不允许。
您可以在全局范围内打开该模块,也可以为其提供一个简短的同义词,以便输入您的类定义。
module M = My_map.Map
<强>更新强>
重读您的问题,我无法摆脱您认为您需要打开模块以使用其符号的感觉。事实并非如此,打开模块只是为了方便。通过使用完整的模块路径,也可以在不打开模块的情况下访问通过打开模块可以访问的任何符号。事实上,许多人(包括我自己)会告诉你除了极少数情况外,不要打开模块。
如果您只是在指定正确的模块路径时遇到问题,那么如果您可以提供演示此问题的自包含(小型)代码,则会有很大帮助。
答案 1 :(得分:2)
我认为你不能在类定义中打开你的模块。 但是,您可以在函数中“打开”它:
module My_map = struct
module Map = (struct
type t = int
let f () : t = 3
end)
end
class my_object =
object
method stuff = My_map.Map.(
let x = f () in
x + f ()
)
end
这样,您就可以使用f
两次,而无需两次编写My_map.Map
。
关于问题的第二部分,正如Jeffrey Scofield所指出的那样,我不确定它是否与打开模块有关。
或许你想要(在我的例子中),f
成为my_object
的方法?
我也认为不可能,我认为没有任何理由。 也许,你想要的是继承?