1

[编辑]

谢谢你的回答,我的问题如下:

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

4

1 回答 1

3

如果你的模块A只需要模块B的类型,没有值,那么你可以用模块B的接口创建一个moduleB.mli,并在moduleA之前编译它:

模块A.ml:

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

模块B.mli:

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

模块B.ml

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

但是,如果您对值或函数有循环依赖,则没有简单的解决方案,例如:

模块A.ml:

let li = [new bar; new bar]

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

可以尝试通过使用引用或可变值来打破这种循环依赖:

模块A.ml:

let li = [new bar; new bar]

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

模块B.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
于 2009-04-06T12:09:30.267 回答