Nazwy pól znajdują się w przestrzeni nazw modułu State
. Możesz powiedzieć g.State.x
, lub możesz otworzyć moduł State
.
let f g = g.State.x
Lub:
open State
let f g = g.x
Jeśli chcesz pola pojawiać się w przestrzeni nazw modułu Game
, można je powtórzyć:
type game = State.state = {x: int; y: int}
Można również skorzystać z możliwości include
obejmować moduł State
.
Na przykład, moduł Game
mógł powiedzieć:
include State
type game = state
W obu tych przypadkach można zwrócić się do Game.x
:
let f g = g.Game.x
Lub:
open Game
let f g = g.x
Istnieje także dwie notacje do otwarcia modułu dla pojedynczego wyrażenia:
let f g = Game.(g.x)
Lub:
let f g = let open Game in g.x
Edit: Oto Unix wiersza polecenia sesji, który pokazuje pierwszy (najprostszy) rozwiązanie:
$ 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
hmm żadna z tych wydają się działać. ..if Próbuję g.State.x mówi "Niezwiązana etykieta pola rekordu State.x" i wstawienie stanu otwartego nic nie zmienia – Mike
Przetestowałem je wszystkie, więc pracują dla mnie. Zakładałem, że każdy moduł był plikiem: state.ml, game.ml i test.ml. Musisz skompilować plik state.ml, następnie game.ml, a następnie test.ml. –
Mam pliki mli do gry i stanu, czy to wpłynęłoby na ich interakcje w jakikolwiek sposób? – Mike