クラスを作らずに、直接的にオブジェクトを生成する方法もあります。
文法はクラス定義とまったく同じですが、結果はクラスではなくオブジェクトになります。このあとの節で述べることは、この直接生成されたオブジェクトにも適用することができます。
#
let p = object val mutable x = 0 method get_x = x method move d = x <- x + d end;;
val p : < get_x : int; move : int -> unit > = <obj>
#
p#get_x;;
- : int = 0
#
p#move 3;;
- : unit = ()
#
p#get_x;;
- : int = 3
クラスは式中で定義することはできませんが、直接生成されたオブジェクトはどこでも用いることができます。さらに、その環境で定義された変数も参照できます。
#
let minmax x y = if x < y then object method min = x method max = y end else object method min = y method max = x end;;
val minmax : 'a -> 'a -> < max : 'a; min : 'a > = <fun>
直接生成されたオブジェクトはクラスと比べると2つの欠点があります。 型が略記されないことと、継承できないことです。 3.3 節「自分自身への参照」や 3.11 節「多相メソッド」で説明するように、この欠点が有用であることもあります。