Next: , Previous: , Up: The objects.fs model   [Contents][Index]


6.24.3.7 Method conveniences

【メソッドをより便利に】通常、 メソッドでは受信オブジェクト(receiving object)に頻繁にアクセスします。 メソッドをプレーンなコロン定義(:noname など)として定義する場合、 多くのスタック体操が必要になる場合があります。 これを回避するには、 m: ... ;m を使用してメソッドを定義します。たとえば、 以下を使用して circledraw するメソッドを定義できます

m: ( x y circle -- )
  ( x y ) this circle-radius @ draw-circle ;m

このメソッドが実行されるときは、 受信オブジェクト(receiver object)(上記例の circle)がスタックから取り除かれます。 その代わりに、 m:;m の間は this を使用して受信オブジェクトにアクセスできます(ええ、 確かに、この例では m: ... ;m を使用する利点ないかもしれませんね)。 注意: しかし、 スタック・コメントとしては m:;m の間のコードだけでなく、 メソッド全体(つまり、 受信オブジェクトを含むメソッド全体)のスタック効果を指定していることに注意してください。 なお、 m:...;m では exit を使用できません。 代わりに、 exitm を使用してください32

あなたは this "field" という形式のシーケンスを頻繁に使用するハメになると思います(上記例では: this circle-radius)。 そこで、 この方法でのみフィールドを使用する場合は、 inst-var を使用してフィールドを定義し、 フィールド名の前の this を削れます。 たとえば、 上記例の circle クラスは以下のように定義することもできます:

graphical class
  cell% inst-var radius

  m: ( x y circle -- )
    radius @ draw-circle ;m
  overrides draw

  m: ( n-radius circle -- )
    radius ! ;m
  overrides construct

end-class circle

radius は、 circle や、 その子孫クラスと、 それらの m:...;m 内でのみ使用できます。

inst-value を使用してフィールドを定義することもできます。 これは、 variable に対して value があるのと同様に、 inst-var に対して inst-value があるのです。 このようなフィールドの値は [to-inst] を使用して変更できます。 たとえば、 クラス circle を以下のように定義することもできます:

graphical class
  inst-value radius

  m: ( x y circle -- )
    radius draw-circle ;m
  overrides draw

  m: ( n-radius circle -- )
    [to-inst] radius ;m
  overrides construct

end-class circle

Footnotes

(32)

さらに、 catch を呼び出すワードや、 objects.fs をロードする前に定義されているワードについては、 catch を再定義したように、 これらも再定義する必要があります: : catch this >r catch r> to-this ;