1

Tcl8.4。

私はこのnamespace木を持っています:

namespace eval menu_tree {

    #--------------------------------------------------------------------------
    ## Main Menu
    namespace eval main_menu {
        variable title "Main Menu"
    }

    #--------------------------------------------------------------------------
    ## Setup Menu
    namespace eval setup_menu {
        variable title "Show Setup Information"
    }

    #--------------------------------------------------------------------------
    ## Help Menu
    namespace eval help_menu {
        variable title "Show Help Information"
    }
}

アイデアは次のような機能を持つことでした:

proc print_title {menu} {
    puts $menu::title
}

これはグローバル変数でうまく機能します。ただし、私が見つけたものから、名前空間名で「$」を使用する必要があります。ウェブで答えを見つけようとしましたが、何も起こりませんでした。誰かがそれを行う方法を知っていますか、そしてそれが可能であるかどうか?

ありがとう、-イリヤ。

4

1 に答える 1

4

ここでの重要なアプローチは、「元のTcl」にはその「$」構文糖衣がまったく含まれていなかったことを覚えておくことです。 変数の内容を取得する元の方法は、引数を1つ呼び出すことsetです。

set foo bar ;# sets variable "foo" to contain the value "bar"
puts [set foo] ;# prints the value contained in variabe "foo"

したがって、おそらく次のようなものを使用する必要があります

proc print_title {menu} {
    puts [set ${menu}::title]
}

そのため${menu}::title、変数の名前に展開され、setその変数の値が取得されます。

「menu」という単語の周りに中括弧が使用されていることに注意してください。中括弧がないと、Tclは「menu::title」という名前の変数を逆参照しようとします。これはおそらく意図したものではありません。

もう1つの注意点は、の動作はprint_title「menu」引数の内容に大きく依存することです。展開後、setコマンドは解決できるはずの文字列を参照する必要があり、これには一連のルールが適用されます。しかし、詳細がわかるまで、それ以上のアドバイスを得るのは難しいです。

そのvsトピックの詳細については、この質問を参照してください。$set

于 2012-04-03T21:04:15.553 に答える