我试图通过使用编译代码而不是顶级来学习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的进程命令?
答案 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;;`