I nomi dei campi si trovano nello spazio dei nomi del modulo State
. Puoi dire g.State.x
, oppure puoi aprire il modulo State
.
let f g = g.State.x
Oppure:
open State
let f g = g.x
Se si desidera che i campi di apparire nello spazio dei nomi del modulo Game
, è possibile ripeterle:
type game = State.state = {x: int; y: int}
È inoltre possibile utilizzare la struttura include
per includere il modulo State
.
Ad esempio, il modulo Game
poteva dire:
include State
type game = state
In entrambi i casi, è possibile fare riferimento a Game.x
:
let f g = g.Game.x
Oppure:
open Game
let f g = g.x
ci sono anche due notazioni per l'apertura di un modulo per una singola espressione:
let f g = Game.(g.x)
Oppure:
let f g = let open Game in g.x
Edit: Ecco una sessione della riga di comando di Unix che mostra la prima soluzione (più semplice):
$ 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
fonte
2012-11-26 02:46:39
hmm nessuna di queste sembra funzionare. ..se provo g.State.x dice "Etichetta campo record non associato State.x" e inserendo lo stato aperto non cambia nulla – Mike
Li ho testati tutti, quindi funzionano per me. Supponevo che ogni modulo fosse un file: state.ml, game.ml e test.ml. È necessario compilare state.ml, quindi game.ml, quindi test.ml. –
Ho file mli per gioco e stato, ciò influenzerebbe in qualche modo la loro interazione? – Mike