3

TCL で次のようなコードを見ました。

namespace eval ::info {
    set count 0;
    set id 1;
    set role admin;

    namespace export *
}



proc ::info::setcount {
    set ::info::count 0;
}

proc ::info::setId {
    set ::info::id 1;
}

proc ::info::setRole {
    set ::info::role user;
}

名前空間 ::info には 3 つの変数が定義されていますが、3 つの procs(setcount setId setRole) が名前空間で宣言されていません。::info の外で定義されているようですが、これは許可されますか? これはどのように作動しますか?

4

2 に答える 2

5

プロシージャ::info名前空間で定義されます。namespace evalそれらは、必要に応じて名前空間を作成し、そのコンテキスト内で指定されたスクリプトを実行するコマンドであるのスコープ内にないだけです。名前空間のコンテキスト内で実行されると、procコマンドの名前が完全修飾されていない場合に作成されるコマンドの配置方法が変わります。名前空間は呼び出しとは独立して存在しnamespace evalます。ただし、変数は名前空間で宣言する必要があります。これにより、人々を捕まえる可能性のある変数の解決に関する非常に厄介な問題が回避されます。

個人的には、次のようなコードを書くことを好みます。

namespace eval ::foo {
    proc bar ... {
        ...
    }
}

しかし、私は他の人が私に同意しないことを知っています. Tcl はどちらのスキームでも問題なく動作するため、好きなように記述してください。

于 2012-03-12T13:15:00.443 に答える
3

namespace evalコマンド_

  1. 名前空間が存在しない場合は作成します
  2. その名前空間内から提供されたコードを実行します

名前空間内から定義された proc (デフォルトの名前空間は :: であるため、すべての proc です)

  • 絶対名前空間が前にある場合、指定された名前空間でそのコマンドを定義します
  • 相対ネームスペースが前にある場合、現在のネームスペースを基準にしてそのコマンドを定義します

そのような

namespace eval bob {
    namespace eval joe {
        proc proc1 {} {}
    }
    proc proc2 {} {}
    proc ::proc3 {} {}
    proc joe::proc4 {} {}
}
proc proc5 {} {}
proc bob::joe::proc6 {} {}
proc ::bob::joe::proc7 {} {}

次のコマンドが存在します

::bob::joe::proc1
::bob::proc2
::proc3
::bob::joe::proc4
::proc5
::bob::joe::proc6
::bob::joe::proc7

グローバル名前空間から呼び出された場合、グローバル名前空間のコマンドの前に a を付けても付けなくてもよいことに注意して::ください。同じことが、どの名前空間のコマンドにも当てはまります。

namespace eval bob {
    proc2 ;# calls ::bob::proc2
    ::proc5 ;# calls ::proc5 (proc5 in the global namespace)
    joe::proc4 ;# calls ::bob::joe::proc4
}

生のコマンド名 (名前空間修飾子がまったくない) は、現在の名前空間を検索し、そこにコマンドが見つからない場合はグローバル名前空間を検索することに注意してください。

namespace eval bob {
    proc5 ;# calls ::proc5 since there is no ::bob::proc5
}
于 2012-03-12T21:30:03.190 に答える