1

以下に示すように、一連のプロシージャと名前空間があります。

namespace eval ::_API { 
    if {[info exists ::_API::API_ids]} { 
        catch {API erase -ids [array names ::_API::API_ids]} 
    } 
    catch {unset API_ids} 
    array set API_ids "" 
} 

proc ::_API::erase { } { 
    foreach id [array names ::_API::API_ids] { 
        if {::_API::API_ids($id) == 0} { 
            continue 
        } 
        if {[catch {API -id $id -redraw 0}] != 0} { 
            set ::_API::API_ids($id) 0 
        } 
    } 
    Redraw ;# I'm not concerned about this part
            # and I'm fairly certain it can be ignored
} 

proc erase { } { 
    ::_API ::erase 
} 

::_API::API_idsポイントを含む配列です (例: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)。スクリプトが行うことは、テーブル内のポイントを消去することです。

::_API名前空間を proc に変換して、GUI ボタン​​を使用して proc を呼び出せるようにしたいと考えています。現在、他のスクリプト (テーブル内のポイントをマップするスクリプト) の直後にあり、必要な場合にのみそれらを消去したいと考えています。つまり、ボタンが押されるタイミングです。

私はすでに::_API::erase直接実行しようとしましたが、機能していません:

proc ::_API::erase { } {
foreach id [array names ::_API::API_ids] {
    if {::_API::API_ids($id) == 0} {
        continue
    }
    if {[catch {API -id $id -redraw 0}] != 0} {
        set ::_API::API_ids($id) 0
    }
}
Redraw
}

名前空間について何かが欠けているのではないかと思います。ドキュメントを読んでみましたが、実際にどのように機能するのかよくわかりません。

4

2 に答える 2

1

つまり、名前空間の初期化コードをプロシージャに変換したいということです。次の例はそれを達成するはずです。

namespace eval ::_API {
}
proc ::_API::initialize {} {
    variable API_ids
    if {[info exists API_ids]} {
        catch {API erase -ids [array names API_ids]}
        unset API_ids
    }
    array set API_ids ""
}

... more definitions ...

::_API::initialize

名前空間を宣言することから始めます。次に、プロシージャで元のコードを複製します。存在しない変数を設定解除しても意味がないので、変数が存在する場合にのみ実行されるブロックに unset を移動します。名前空間定義の最後で、初期化関数を呼び出して名前空間を初期化します。

于 2013-09-14T09:04:19.197 に答える