OCAML中的循环依赖控制

时间:2009-04-06 11:32:17

标签: compiler-construction dependency-injection module ocaml circular-dependency

[编辑]

感谢您的回答,我的问题如下:

模块A名为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#!!!!! 中的这种依赖性 谢谢

1 个答案:

答案 0 :(得分:3)

如果您的模块A只需要来自模块B的类型且没有值,那么您可以使用模块B的接口创建moduleB.mli,并在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