如果我在模块状态中有一个类型
type state = {x: int; y: int}
我在模块游戏中有另一种类型
type game = State.state
如何访问具有游戏类型的对象中的记录值?
例如,如果我有一个游戏“g”,gx 会给我一个“未绑定记录字段标签 x”错误。
字段的名称位于State
模块命名空间中。你可以说g.State.x
,或者你可以打开State
模块。
let f g = g.State.x
或者:
open State
let f g = g.x
如果您希望字段出现在Game
模块命名空间中,您可以重复它们:
type game = State.state = {x: int; y: int}
您还可以使用该include
工具来包含该State
模块。
例如,您的Game
模块可以说:
include State
type game = state
在这两种情况下,您都可以参考Game.x
:
let f g = g.Game.x
或者:
open Game
let f g = g.x
也有两种表示法可以为一个表达式打开一个模块:
let f g = Game.(g.x)
或者:
let f g = let open Game in g.x
编辑: 这是一个显示第一个(最简单)解决方案的 Unix 命令行会话:
$ cat state.ml
type state = { x: int; y : int }
$ cat game.ml
type game = State.state
$ cat test.ml
let f (g: Game.game) = g.State.x
let () = Printf.printf "%d\n" (f { State.x = 3; y = 4})
$ ocamlc -o test state.ml game.ml test.ml
$ ./test
3