2012年7月22日日曜日

[ドリトル] self

self(自分)の使い方を確認しておこう。

lblResult = Label ! "result" create.
lblResult2 = Label ! "result2" create nextline.

t1 = Turtle ! create.
t1Child = t1 ! create.
t1:value = 1.

t1Child:test1 = [ lblResult ! (value) set ].
t1Child:test2 = [ lblResult2 ! (self:value) set ].

t1Child!test1.
t1Child!test2.

結果はいずれも 「1」になる。self 指定も無指定も検索起点は 自オブジェクトで、自オブジェクトにプロパティ値が設定されていないので親のプロパティ値が取得される。
ちなみに、「 :value 」を指定すると起点がルートになるので、「 undef 」になる。


親オブジェクトの命令コード中の self

次は、親オブジェクトの命令が呼び出された時の self の扱い。

lblResult = Label ! "result" create.
lblResult2 = Label ! "result2" create nextline.

t1 = Turtle ! create.
t1Child = t1 ! create.
t1:value = 1.
t1Child:value = 2.

t1:test1 = [ 
  lblResult ! (value) set.
  lblResult2 ! (self:value) set
].

t1Child!test1.

この場合の結果はいずれも「2」。
つまり、呼び出された命令は親オブジェクトで定義されている命令だが、 t1Child のコンテキストで実行されているため、self は t2 オブジェクトを指していることになる。
実際このようなコードでは結果は「 t1Child 」になる。

lblResult = Label ! "result" create.

t1 = Turtle ! create.
t1Child = t1 ! create.

t1:test1 = [ 
  [ self == t1Child ] ! then [lblResult ! "t1Child" set]
  else [lblResult ! "t1" set] execute.
].

t1Child!test1.




Timer 実行ブロック中での self

次は、メソッド中で定義される Timer。Timer の実行ブロック中での self の扱いを確認してみよう。

lblResult = Label ! "result" create.

t1 = Turtle ! create.
t1Child = t1 ! create.
t1:value = 1.
t1Child:value = 2.

t1:test1 = [ 
  timer1 = Timer ! create.
  timer1 ! 1 interval 1 times.
  timer1 ! [ lblResult ! (self:value) set.] execute. 
].

t1Child!test1.

結果は2.やや意外。timer1 の実行ブロックは timer1 のコンテキストで実行されるので、 timer1 が self 扱いになるかと思ったが、self の解釈は定義時に決まるのだろうか?

...
  timer1 ! [ lblResult ! (self:value) set.] execute. 
  t1Child:value = 10.
  ...

こうすると結果は 「10」になるので、「(self:value)」が先に評価されて値が決定されているわけではなさそう。

解釈が難しい結果になった。



0 件のコメント:

コメントを投稿