Smalltalk ではオブジェクトに class というメッセージを送ると、そのオブジェクトが属するクラス(つまりオブジェクトの“種類”)を返してきます。
クラスもそれ自体オブジェクトなので、それぞれ属するクラス(メタクラス)があり、やはり同じ class メッセージに応答できます。なお、通常のクラスと違い、メタクラスは原則として無名なので、それに属するクラスの名を借りて「クラス名 class」と呼称されます。これはメタクラスそれ自身を返す式としても扱えます。
余談ですが、メタクラスもまたオブジェクトなので class メッセージに応答できます。ちなみに、メタクラスは皆、Metaclass というクラスのインスタンスです。Metaclass のクラスである Mataclass class もその例外ではないので、つまり Metaclass class は Metaclass のクラスであり同時にインスタンスでもあるという(静的言語では考えにくい)不思議なことが起こります。
他に変わったところとして、多くの Smalltalk 処理系(と同時に“環境”)ではメソッドもコンテキストもプロセス(=スレッド)も、パーサーやコンパイラも、画面表示領域やウィジェットやエディタ、パラグラフまでも、すべてオブジェクトなので、皆やはり class メッセージに応答でき、自らが属するクラスを返すことができます。
Object new class "=> Object "
1 class "=> SmallInteger "
1.1 class "=> Float "
(2/3) class "=> Fraction "
1e10 class "=> LargePositiveInteger "
1.1s1 class "=> ScaledDecimal "
1.1i class "=> Complex "
(2@3) class "=> Point "
$a class "=> Character "
nil class "=> UndefinedObject "
true class "=> True "
false class "=> False "
'abc' class "=> ByteString "
#abc class "=> ByteSymbol "
'あいう' class "=> WideString "
#(1 2 3) class "=> Array "
{1. 2. 3} class "=> Array "
[:x|x+3] class "=> BlockContext "
Array class "=> Array class "
(Array class) class "=> Metaclass "
(Integer>>#+) class "=> CompiledMethod "
thisContext class "=> MethodContext "
Processor activeProcess class "=> Process "
Display class "=> DisplayScreen "
sumim
#4070()
[
Smalltalk
]
Rating1/1=1.00
クラスもそれ自体オブジェクトなので、それぞれ属するクラス(メタクラス)があり、やはり同じ class メッセージに応答できます。なお、通常のクラスと違い、メタクラスは原則として無名なので、それに属するクラスの名を借りて「クラス名 class」と呼称されます。これはメタクラスそれ自身を返す式としても扱えます。
余談ですが、メタクラスもまたオブジェクトなので class メッセージに応答できます。ちなみに、メタクラスは皆、Metaclass というクラスのインスタンスです。Metaclass のクラスである Mataclass class もその例外ではないので、つまり Metaclass class は Metaclass のクラスであり同時にインスタンスでもあるという(静的言語では考えにくい)不思議なことが起こります。
他に変わったところとして、多くの Smalltalk 処理系(と同時に“環境”)ではメソッドもコンテキストもプロセス(=スレッド)も、パーサーやコンパイラも、画面表示領域やウィジェットやエディタ、パラグラフまでも、すべてオブジェクトなので、皆やはり class メッセージに応答でき、自らが属するクラスを返すことができます。
Object new class "=> Object " 1 class "=> SmallInteger " 1.1 class "=> Float " (2/3) class "=> Fraction " 1e10 class "=> LargePositiveInteger " 1.1s1 class "=> ScaledDecimal " 1.1i class "=> Complex " (2@3) class "=> Point " $a class "=> Character " nil class "=> UndefinedObject " true class "=> True " false class "=> False " 'abc' class "=> ByteString " #abc class "=> ByteSymbol " 'あいう' class "=> WideString " #(1 2 3) class "=> Array " {1. 2. 3} class "=> Array " [:x|x+3] class "=> BlockContext " Array class "=> Array class " (Array class) class "=> Metaclass " (Integer>>#+) class "=> CompiledMethod " thisContext class "=> MethodContext " Processor activeProcess class "=> Process " Display class "=> DisplayScreen "Rating1/1=1.00-0+
[ reply ]