1

itcl を使用して多数のオブジェクトを作成し、それらをデータ構造に格納して、後でそれらのメソッドを呼び出すことができるようにしようとしています。しかし、それはエラーを出しています:

以下は私が書いたコードです:

    itcl::class router {
        variable name;
        variable mac;
        variable interface_list;
        variable topology;

        constructor {rname rmac rtopology} {
            puts "creating new router $rname / $rmac within [$rtopology get_name]"
            set name $rname;
            set mac $rmac;
            set topology $rtopology;
        }

        destructor {
            delete $this;
        }

        method add_interface {name network_id} {
            set int [interface #auto $name $network_id $this];
            lappend interface_list $int;
        }

        method get_interfaces {} {
            return $interface_list;
        }

        method get_name{} {
            return $name;
        }

        method get_mac{} {
            return $mac;
        }

        method get_topology {} {
            return $topology;
        }
    }

    itcl::class topology {
        variable name;
        variable router_list;

        constructor {tname} {
            set name $tname;
            set router_list [dict create];
        }

        method add_router {name mac} {
            set newrouter [router #auto $name $mac $this];
            dict set router_list $name $newrouter;
        }

        method add_routerinterface {rname iname networkid} {
            foreach r [dict keys $router_list] {
                if {[$r get_name] == rname} {
                    $r add_interface $iname $networkid;
                    break;
                }
            }
        }

        method get_name {} {
            return $name;
        }

        method get_routers {} {
            return $router_list;
        }

        method show {} {
            foreach rkey $router_list {
                set router [dict get $router_list $rkey];
                set rname [$router get_name];
            }
        }
    }



topology t "JitixNet";
t add_router R1 fwe2165;
t add_router R2 dagsyu2;
t add_router R3 fasdjg3;

t show;

エラーは次のとおりです。

D:\Tcl\code>tclsh network-topology.tcl
JitixNet 内に新しいルーター R1 / fwe2165 を作成する
JitixNet 内に新しいルーター R2 / dagsyu2 を作成する
JitixNet 内に新しいルーター R3 / fasdjg3 を作成する
不正なオプション "get_name": 次のいずれかにする必要があります...
  router0 add_interface 名 network_id
  router0 cget -オプション
  router0 configure ?-option? ?value -オプション値...?
  router0 get_interfaces
  router0 get_mac{} return $mac;
  router0 get_name{} return $name;
  router0 get_topology
  router0 is className
    実行中
「$router get_name」
    (オブジェクト "::t" メソッド "::topology::show" 本文 4 行目)
    内部から呼び出された
「Tショー」
    (ファイル「network-topology.tcl」の 142 行目)

誰か助けてくれませんか?私は頭がおかしくなりました...率直に言って、ITclがJavaに似たものになることを期待していました...

4

1 に答える 1

3

問題は、メソッド名と (空の) パラメータ リストの間にスペースを入れる必要があることです。これは、Tcl のコマンドでは正常です (標準の Tcl プロシージャを宣言する場合は、同じことを行う必要があります)。

診断の手引き

エラー メッセージを見ると、「許可されている呼び出し方法」の 1 つが次のようになっていることがわかります。

get_name{} return $name;

これは非常に奇妙な名前であり、明らかに奇妙なパラメータ セットでもあります。コードをざっと見てみると、スペースがないことがわかります。(ITcl が部分的な宣言を処理する方法の特殊性のため、エラーではありません。私はそれを特に気にしませんが、それはトピックから外れています...)

于 2012-01-31T13:30:21.023 に答える