首页 > 解决方案 > OCaml "include Module" 只包含接口暴露的函数

问题描述

我正在尝试测试一个名为Game. 但是,在我的项目的正常上下文中使用时,初始化函数Game只接受几个参数。这意味着某些测试需要我初始化Game,然后执行数百个操作的特定组合才能达到所需的状态,这是不可行的。

我的想法是创建一个新的 init 函数,允许用户对Game对象的每个组件进行硬编码。因为它只用于测试,所以让这个 init 函数成为典型 mli 接口的一部分似乎是个坏主意,所以我认为include在我的testGame.ml文件中使用关键字会有所帮助。

在 mytestGame.ml中,两者generate_player_idsGame.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"

标签: moduleincludeocaml

解决方案


您假设这是因为它们没有暴露是非常正确的。include在 OCaml 的模块系统上工作,而不是像 C 那样的直接源包含基础。

如果您忽略.mli接口文件,默认情况下所有内容都会公开。


推荐阅读