1

[EDIT]управление циклической зависимости в OCaml

Спасибо за ваш ответ, моя проблема заключается в следующем:

Модуль А называется Map.ml

let lst = ref [Instance1_ModuleB; Instance2_ModuleB; ...];; 
let is_coliding p = DoSomeWork_And_Return_A_Bool ;; 
.... other things here. 

Модуль B под названием Player.ml

Open Map 
class player_object (x_in, y_in, name_in)= 

object (self) 

method jump() = 
     if Map.is_colliding self then 
      DoSomeThing();; 
.... 

Любой ключ, как это сделать.

Кстати, как другие языки программирования связывают это? Я никогда не забочусь о такой зависимости в C# !!!!! Благодаря

ответ

3

Если модуль А нужен только тип из модуля B и никакой ценности, то вы можете создать moduleB.mli с интерфейсом модуля B, и компилировать его перед ModuleA:

moduleA.ml:

let foo (bar : ModuleB.bar) = bar.baaz 

moduleB.mli:

class bar : object 
    method baaz : int 
    method buz : int 
end 

moduleB.ml

class bar = 
object(s) 
    method baaz = 3 
    method buz = ModuleA.foo s 
end 

Но если у вас есть круговую зависимость от величины или функции, это не простое решение, как, например, для:

moduleA.ml:

let li = [new bar; new bar] 

let foo (bar : ModuleB.bar) = bar.baaz 

Можно попытаться разорвать такой круговой зависимость с помощью ссылки или изменяемого значения в целом:

moduleA.ml:

let li = [new bar; new bar] 

let foo (bar : ModuleB.bar) = bar.baaz 
let _ = ModuleB.initB foo 

moduleB.ml

let foo = ref (fun x -> (failwith "not initialized" : int)) 

class bar = 
object(s) 
    method baaz = 3 
    method buz = !foo s 
end 

let initB f = foo := f