いつもの某 Ruby スレをながめていたら こんなの を見つけて(これとは直接は関係ないのですが)「ソースはかりそめ」の話は Ruby ではどうなっているのかなぁ…と思って試してみました。
class A def a; [1, 2, 3] end end a0 = A.new a1 = A.new a0.a[0] = 'hoge' p a0.a #=> [1, 2, 3] p a1.a #=> [1, 2, 3]
ちなみに、表題の引用元にもありますが Squeak システムの Smalltalk だと、Ruby の例同様に適当な A >> #a(クラス A のメソッド #a)を、このように
A >> a ^ #(1 2 3)
定義して、以下のスクリプトを実行すると、
a1 a2 |
となり(かつての私を含めた)素人さんはちょっとびっくりしちゃいます(笑)。これは、メソッドがオブジェクトであること(ソースはそれを作るための手段のひとつにすぎないこと)が分かっていれば想像に難くない、かつ、しごくまっとうな振る舞い(善し悪しは別にして)なのですが、なかなかここまで徹底したオブジェクトセンスは会得 and/or 納得しにくいものではないかとも思います。(なお、VisualWorks ではスクリプト中のリテラルの破壊的操作は許可されていません)
念のため、A の定義はこちら。
'From SqueakNihongo6.1 of 17 April 2004 [latest update: #0]'! Object subclass: #A instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Category-Mutable'! !A methodsFor: 'as yet unclassified'! a ^ #(1 2 3)! !