0

Incr Tcl では、アプリケーションを再起動せずに、実行中の Tcl インタープリターにクラスのメソッドを変更して再評価することで、プログラミングの生産性が向上します。そのためには、本体の構文を使用してクラス定義の外でメソッドを定義し、実行中の Tcl インタープリターで本体の定義を再評価する必要があります。それはうまくいきます。Incr Tclでは、驚くべきことに、明らかに設計上、

クラス メソッドとプロシージャの本体は対話型デバッグのために何度でも定義できますが、クラスは 1 回しか定義できません。

ただし、開発中は当然、メソッドを分割 (リファクタリング) して、同じクラスで定義する 2 つ以上の追加メソッドにします。

実行中の Tcl インタープリターで既存のクラスにメソッドを強制的に追加する方法を見つけたいと思います。

  1. クラス定義を削除して実行中の Tcl インタープリターに再評価することなく、
  2. 拡張する増分 Tcl クラスの既存のオブジェクト インスタンスを含む Tcl アプリケーションを再起動せずに、および
  3. 既存のオブジェクトが上記の Tcl インタープリターから削除されるという結果はありません。

これは、本番コードではなく、開発/デバッグの儀式としてのみ必要です (つまり、プログラムでメソッドを動的に追加する必要はありません)。ぬるぬるした、邪悪な、裏口の答えを楽しませてくれます。Incr Tcl のプロダクション コピーを変更して追加の動作を追加することは実用的ではありません。使用する必要がある Incr Tcl のバイナリは、残念ながら、実行中のプロセスに静的にバインドされており、共有ライブラリの魔術を介してアンロードおよびリロードできないからです。

4

1 に答える 1

2

クラスのメソッドを次のように再定義できますitcl::body

itcl::body helloworld::greet {} {
    puts "Goodbye Cruel World from $owner"
}

ただし、まったく新しいメソッドをそのようにクラスに追加することはできません。まあ、確かに 3.4 ではありません (4.0 ではテストしていません):

% パッケージには Itcl が必要です
3.4
% itcl::class hi {
    # ここには私たちニワトリ以外誰もいません...
}
% ハイハイ
やあ
% itcl::body hi::there {} {puts "Howdy!"}
関数 "there" はクラス "::hi" で定義されていません

そのような機能が必要な場合は、XOTcl または (Tcl 8.5 以降) TclOO の使用を検討してください。どちらも作成後のクラスの完全な再構成をサポートしています。

于 2012-07-29T15:03:42.863 に答える