2017-11-28 21 views
0

Tcloo(自己コンパイルされたTCL 8.6.7)を使用して、クライアントソケットを実装しました。TCLOO:プライベートメソッドとメソッドコールバックとして

私はfolowing問題があります:私はどのように唯一のオブジェクト指向を使用して宣言が::私はのためのイベントコールバックとしてクラスのメソッドを登録するにはどうすればよいクラス

  • を作成するときにメソッドをプライベートにすることができ

    1. をソケット 私は次のことを試してみました:

      ちゃんイベント$靴下読める[リストreadSocket $靴下] エラー:無効なコマンド名 "readSocket" ...

      ちゃんイベント$靴下読める[リストを[自動] readSocket $靴下] エラー:無効なコマンド名 "自己" ...

    すべてのヘルプは理解されるであろう。

  • 答えて

    1

    小文字で始まる名前のメソッドはpublic、その他はprivateです。 exportunexportを使用することもできます。

    oo::class create C { 
        method foo args {} ;# public 
    
        method Bar args {} ;# private 
    
        method Baz args {} ;# private 
        export Baz   ;# now it's public 
    
        method quux args {} ;# public 
        unexport quux  ;# now it's private 
    } 
    

    通常Tclでは、さまざまな方法を使用してコールバックを定義できます。オブジェクトが使用するネームスペースを知り、そのネームスペースに対してmyメソッドを修飾する必要があります。

    オブジェクト内に、名前空間がself namespace又はnamespace which myを用いてイントロスペクトすることができるが、最も簡単な方法は、namespace codeを使用することであるから:

    namespace code {my readSocket $sock} 
    namespace code [list my readSocket $sock] 
    

    これらの差が上段に、$sockは変数置換を取得することですコールバックが呼び出されると、2行目でコールバックが定義されたときに置き換えられます。この呼び出しの結果は、名前空間に依存しないコマンド接頭辞であり、評価コマンドによって実行されます。コンテキスト内でsockが表示されている必要があります。通常の名前空間変数は、variableが呼び出されていないと表示されません。 TclOOのクラスレベルの変数は、すべてのメソッドの中で見ることができます。 (コールバックが定義されている時に発信者の名前空間内の評価sock。)

    list [info object namespace $obj]::my readSocket $sock 
    

    ドキュメント:オブジェクトの外部から

    、オブジェクトの名前空間はinfo object namespaceを使用して同定することができる infolist、 、my、 、namespace、 、oo::classoo::defineSummary of Tcl language syntax

    +0

    あなたの答えはありがとう。私はまた、エラーの原因を追跡しました。なぜなら、 "namespace path {:: tcl :: mathop}"を使ってmathopオペレータコマンドにアクセスしたからです。私は名前空間をインポートしてエラーがなくなりました。ありがとう、問題解決 – yaro

    +0

    私はコールバックを作成するためのヘルパーコマンドを書くべきかどうか疑問に思っていましたが、上記の答えオプションが説明するように多くのことをしています。 –

    関連する問題