Comment detail

オブジェクトの種類を調べる (Nested Flatten)
Smalltalk ではオブジェクトに class というメッセージを送ると、そのオブジェクトが属するクラス(つまりオブジェクトの“種類”)を返してきます。

クラスもそれ自体オブジェクトなので、それぞれ属するクラス(メタクラス)があり、やはり同じ class メッセージに応答できます。なお、通常のクラスと違い、メタクラスは原則として無名なので、それに属するクラスの名を借りて「クラス名 class」と呼称されます。これはメタクラスそれ自身を返す式としても扱えます。

余談ですが、メタクラスもまたオブジェクトなので class メッセージに応答できます。ちなみに、メタクラスは皆、Metaclass というクラスのインスタンスです。Metaclass のクラスである Mataclass class もその例外ではないので、つまり Metaclass class は Metaclass のクラスであり同時にインスタンスでもあるという(静的言語では考えにくい)不思議なことが起こります。


他に変わったところとして、多くの Smalltalk 処理系(と同時に“環境”)ではメソッドもコンテキストもプロセス(=スレッド)も、パーサーやコンパイラも、画面表示領域やウィジェットやエディタ、パラグラフまでも、すべてオブジェクトなので、皆やはり class メッセージに応答でき、自らが属するクラスを返すことができます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 "

Index

Feed

Other

Link

Pathtraq

loading...