module - OCaml "include Module" 只包含接口暴露的函数
问题描述
我正在尝试测试一个名为Game
. 但是,在我的项目的正常上下文中使用时,初始化函数Game
只接受几个参数。这意味着某些测试需要我初始化Game
,然后执行数百个操作的特定组合才能达到所需的状态,这是不可行的。
我的想法是创建一个新的 init 函数,允许用户对Game
对象的每个组件进行硬编码。因为它只用于测试,所以让这个 init 函数成为典型 mli 接口的一部分似乎是个坏主意,所以我认为include
在我的testGame.ml
文件中使用关键字会有所帮助。
在 mytestGame.ml
中,两者generate_player_ids
和Game.t
类型都是“未绑定的”,即使我在test.ml
. 这一定是因为它们没有暴露在 中game.mli
,但我认为使用include
本质上就像复制和粘贴整个模块,包括 .ml 文件中未暴露的部分。有没有办法testGame.ml
识别这些?否则,为了测试目的,拥有识别模块隐藏部分的函数的惯用方法是什么?
测试游戏.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;
}
游戏.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
接口文件,默认情况下所有内容都会公开。
推荐阅读
- ios - NETunnelProviderSession startTunnel() 不启动 VPN 连接
- node.js - 如何选择流中的特定块来使用 Axios 和 nodejs
- javascript - 我们如何使用 express 在 nodeJS 中实现管理面板?
- angular - Angular Reactive 表单部分表单提交
- javascript - 24 小时后使用 Cloud Functions 从 Firestore 中删除消息
- javascript - view.goTo 地图呈现空白 arcgis
- regex - Python 正则表达式 - {e<=1} 发生了什么?
- javascript - 计算网站新访问者的最简单方法
- pine-script - Ma Crossover 有很多滞后
- c++ - 释放由全局替换运算符 new 返回的指针,而不调用替换运算符 delete 是未定义的行为吗?(C++17)