在OCaml中执行的过程

yja*_*src 0 ocaml

我有以下代码:

let p = print_string("finished\n");;

let x0 = ref 0;;

class point =
  object
    val mutable x = incr x0; !x0
    method get_x = x
    method move d = x <- x + d
  end
;;

print_int(new point#get_x);;
p;;
print_int(new point#get_x);;
p;;
Run Code Online (Sandbox Code Playgroud)

无法理解为什么输出是:

finished
12
Run Code Online (Sandbox Code Playgroud)

我的期望实际上是:

1
finished
2
finished
Run Code Online (Sandbox Code Playgroud)

任何人都可以知道执行这段代码的正确顺序是什么?

Jef*_*eld 5

混淆的主要原因是你p不是一个功能.这只是一个价值.特别是,它是值()(称为单位).因此,当您p稍后在代码中进行评估时,它无效.所有工作都是在创建p时完成的.

如果你想让p像一个函数(你似乎想要的那样),你应该像这样定义它:

let p () = print_string "finished\n";;
Run Code Online (Sandbox Code Playgroud)

你应该这样称呼它:

p ();;
Run Code Online (Sandbox Code Playgroud)