3.2 直接生成されたオブジェクト

クラスを作らずに、直接的にオブジェクトを生成する方法もあります。

文法はクラス定義とまったく同じですが、結果はクラスではなくオブジェクトになります。このあとの節で述べることは、この直接生成されたオブジェクトにも適用することができます。

#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 節「多相メソッド」で説明するように、この欠点が有用であることもあります。