如何解决OCaml“包含模块”只包含接口暴露的函数
我正在尝试测试名为 Game
的 OCaml 模块。但是,Game
的初始化函数在我项目的正常上下文中使用时,只接受几个参数。这意味着某些测试需要我初始化 Game
,然后执行数百个操作的特定组合才能达到所需的状态,这是不可行的。
我的想法是创建一个新的 init 函数,允许用户对 Game
对象的每个组件进行硬编码。由于它仅用于测试,因此将此 init 函数作为典型 mli 接口的一部分似乎是个坏主意,因此我认为在我的 include
文件中使用关键字 testGame.ml
会有所帮助.
在我的 testGame.ml
中,generate_player_ids
和 Game.t
类型都是“未绑定的”,即使我在 test.ml
中定义了它们。这一定是因为它们没有在 game.mli
中公开,但我认为使用 include
本质上就像复制和粘贴整个模块,包括未公开的 .ml 文件部分.有没有办法让 testGame.ml
识别这些?否则,为了测试目的,具有识别模块隐藏部分的函数的惯用方法是什么?
testGame.ml:
include Game
let init_game_test
num_players
board
turn
starting_turn
setup_rounds_left
scoring_points
num_rounds =
let player_ids = generate_player_ids num_players in
{
players = players_of_player_ids player_ids;
player_order = player_ids;
board;
turn;
starting_turn;
setup_rounds_left;
scoring_points;
num_rounds;
}
game.ml:
type t = {
players : (PlayerId.t * Player.t) list;
player_order : PlayerId.t list;
board : Board.t;
turn : PlayerId.t;
starting_turn : PlayerId.t;
setup_rounds_left : int;
scoring_points : (Cell.soil * int list) list;
num_rounds : int;
}
let generate_player_ids num_players =
match num_players with
| 2 -> [ 1; 2 ]
| 3 -> [ 1; 2; 3 ]
| 4 -> [ 1; 2; 3; 4 ]
| _ -> failwith "Must be 2-4 players"
解决方法
您认为这是因为它们没有暴露是非常正确的。 include
适用于 OCaml 的模块系统,而不是像 C 那样的直接源包含基础。
如果您省略 .mli
接口文件,则默认情况下所有内容都会公开。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。