擬変数

self、super、thisContext、あるいは、メソッドのパラメータ変数やブロックのブロック変数が擬変数(変数のように使えるが、ユーザーが任意のオブジェクトを代入できない。つまり代入できない)であることは、 誰でもある程度、直感で理解できるものですが、nil や true、false がそれであることは分かりにくいですね。ついつい、nil、true、false といったオブジェクト(リテラル)たちが実際に存在するかのように思えてしまいます。

そんなとき、便利(?)なのが、リテラルのみを要素に限定した an Array のリテラル式。

#('this' is $a 10)

これに、nil、true、false などを入れて評価(print it)してやればこれらがリテラルでないことが実感できます。w

#(self super thisContext nil true false)

"=> #(#self #super #thisContext #nil #true #false) "

てなぐあいで、全部、シンボル(a Symbol)になってしまいます。

#(self super thisContext nil true false)
   allSatisfy: [: each | each class == Symbol]   "=> true "

なお、Squeak システムでの Smalltalk では、掟破りのカーリーブレイス(中括弧)が、任意のオブジェクトを要素とする an Array の生成に使えるので、

{self. super. thisContext. nil. true. false}

"=> #(nil nil UndefinedObject>>DoIt nil true false) "

なんてふうにすることで(擬変数がシンボルになってしまう問題(?)は)回避できます。カーリーブレイスは、その中のひとつひとつの式の評価結果を各要素にするので、要素の切れ目には式の区切りを意味するピリオドを忘れないでね!w