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 网络拓扑.tcl
在 JitixNet 中创建新路由器 R1 / fwe2165
在 JitixNet 中创建新路由器 R2 / dagsyu2
在 JitixNet 中创建新路由器 R3 / fasdjg3
错误选项“get_name”:应该是...之一
  router0 add_interface name network_id
  router0 cget -选项
  router0 配置?-选项??value - 选项值...?
  router0 获取接口
  router0 get_mac{} 返回 $mac;
  router0 get_name{} 返回 $name;
  router0 get_topology
  router0 isa 类名
    在执行时
"$router get_name"
    (对象“::t”方法“::topology::show”正文第4行)
    从内部调用
“t 显示”
    (文件“network-topology.tcl”第 142 行)

有人可以帮忙吗?我已经束手无策了...坦率地说,我希望 ITcl 类似于 Java...

4

1 回答 1

3

问题是您需要在方法名称和(空)参数列表之间放置一个空格。这对于 Tcl 中的命令是正常的(如果声明标准 Tcl 过程,您必须这样做)。

诊断指南

如果您查看错误消息,您可以看到“允许的调用方式”之一是:

get_name{} 返回 $name;

这是一个非常奇怪的名字和一组明显奇怪的参数。快速浏览一下代码可以确认没有空格。(这不是一个错误,因为 ITcl 处理部分声明的方式有特殊性。我不是特别在意,但这已经离题了……)

于 2012-01-31T13:30:21.023 回答