ソースはかりそめ

いつもの某 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
a1 := A new. a2 := A new. a1 a at: 1 put: 'hoge'. Transcript cr; show: a1 a. "=> #('hoge' 2 3) " Transcript cr; show: a2 a "=> #('hoge' 2 3) "

となり(かつての私を含めた)素人さんはちょっとびっくりしちゃいます(笑)。これは、メソッドがオブジェクトであること(ソースはそれを作るための手段のひとつにすぎないこと)が分かっていれば想像に難くない、かつ、しごくまっとうな振る舞い(善し悪しは別にして)なのですが、なかなかここまで徹底したオブジェクトセンスは会得 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)! !