在OCaml中即时创建对象

时间:2009-02-04 16:34:32

标签: oop functional-programming ocaml

我试图通过使用编译代码而不是顶级来学习OCaml;但是,大多数在线示例代码似乎都对后者有吸引力。

我想在下面的对象的方法中创建一个新的Foo。此代码无法编译,引用了doFooProc定义的语法错误。

class bar =
object (self)
 method doFooProc = (new Foo "test")#process
end;;

class foo (param1:string)=
object (self)
 method process = Printf.printf "%s\n" "Processing!"
 initializer Printf.printf "Initializing with param = %s\n" param1
end;;

此外,“let”语法在类定义中似乎不友好。那是为什么?

class bar =
object (self)
 method doFooProc = 
  let xxx = (new Foo "test");
  xxx#process
end;;

class foo (param1:string)=
object (self)
 method process = Printf.printf "%s\n" "Processing!"
 initializer Printf.printf "Initializing with param = %s\n" param1
end;;

如何在doFooProc方法中创建类foo的新对象并调用实例化的foo的进程命令?

2 个答案:

答案 0 :(得分:2)

你大多是正确的,但是要么在模块系统中混淆语法,要么考虑其他语言。考虑一下你应该做得好!

  

我想创建一个新的Foo   在每个对象的方法中   下面。此代码无法编译,   引用语法错误   doFooProc定义。

对象的小写“foo”,模块是大写的。此外,您必须将foo的定义放在调用它的对象之上。如果发生这种情况,你应该得到Unbound class foo

class bar =
object (self)
 method doFooProc = (new foo "test")#process
end;;
  

此外,“let”语法在类定义中似乎不友好。那是为什么?

因为你没有匹配的in,所以你有一个分号。然后它会工作。此外,你可以删除那些额外的parens,但这没关系。

class bar =
object (self)
 method doFooProc = 
  let xxx = (new Foo "test") in
  xxx#process
end;;
  

例如,如果foo中的方法被实例化   一个酒吧,有没有办法   逃避出现的问题   在其中排序类定义   源文件?

是。这就像编写相互递归的函数和模块一样,用and关键字将它们连接起来。

class bar =
  object (self)
    method doFooProc = (new foo "test")#process
  end

and foo (param1:string) = 
  object (self)
    method process = Printf.printf "%s\n" "Processing!"
    initializer Printf.printf "Initializing with param = %s\n" param1
  end

答案 1 :(得分:2)

对于两个相互递归的类,请使用和关键字

class bar =
  object (self)
    method doFooProc = 
      let xxx = (new foo "test") in
      xxx#process
  end
and foo (param1:string)=
  object (self)
    method process = Printf.printf "%s\n" "Processing!"
    initializer Printf.printf "Initializing with param = %s\n" param1
    method bar = new bar
  end;;`