OCaml также поддерживает богатую объектно-ориентированную систему
class counter = object
val mutable r = 0
method value =
r
method incr =
r <- r + 1;
r
method reset =
r <- 0;
0
end
Мы можем использовать наши counter
как этот
let () =
let c = new counter in
printf "counter value: %d\n" c#value; (* counter value: 0 *)
printf "counter value: %d\n" c#incr; (* counter value: 1 *)
printf "counter value: %d\n" c#incr; (* counter value: 2 *)
printf "counter value: %d\n" c#incr; (* counter value: 3 *)
printf "counter value: %d\n" c#value; (* counter value: 3 *)
printf "counter value: %d\n" c#value; (* counter value: 3 *)
printf "counter value: %d\n" c#reset; (* counter value: 0 *)
printf "counter value: %d\n" c#incr; (* counter value: 1 *)
Экземпляры класса инкапсулируют их элементы данных, поэтому мы можем легкоуправлять несколькими счетчиками
let () =
let a = new counter in
let b = new counter in
printf "A: %d, B: %d\n" a#value b#value; (* A: 0, B: 0 *)
printf "A: %d, B: %d\n" a#incr b#value; (* A: 1, B: 0 *)
printf "A: %d, B: %d\n" a#incr b#value; (* A: 2, B: 0 *)
printf "A: %d, B: %d\n" a#incr b#value; (* A: 3, B: 0 *)
printf "A: %d, B: %d\n" a#value b#incr; (* A: 3, B: 1 *)
printf "A: %d, B: %d\n" a#value b#incr; (* A: 3, B: 2 *)
printf "A: %d, B: %d\n" a#value b#incr; (* A: 3, B: 3 *)
printf "A: %d, B: %d\n" a#reset b#reset; (* A: 0, B: 0 *)