【问题标题】:Incr Tcl Objects in List/Array/Dict在列表/数组/字典中增加 Tcl 对象
【发布时间】:2012-01-31 13:16:32
【问题描述】:

我正在尝试使用 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...

【问题讨论】:

    标签: tcl incr-tcl


    【解决方案1】:

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

    诊断指南

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

     get_name{} 返回 $name; 

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

    【讨论】:

    • 一般来说,阅读整个错误信息。这通常在 Tcl 中提供了非常丰富的信息……
    • 非常感谢多纳尔!您的回答非常有帮助.. :) 我一直在为 tcl 上的间距和 $ 符号苦苦挣扎....
    • @Jit 你的问题几乎可以肯定是你已经习惯了它在其他一些语言中的工作方式。在 Tcl 中,$ 的意思是“现在读取一个变量”,所有内容最初都被解析为由空格分隔的单词(这些单词是命令的名称和它们的参数)。除此之外,几乎没有什么神奇之处,至少在解析级别上是这样。 Tcl 在那里几乎没有什么魔力。 (一些标准命令具有很高的魔商,但您始终可以准确地计算出您传递给它们的内容。)
    猜你喜欢
    • 2022-11-09
    • 1970-01-01
    • 2018-07-06
    • 2020-04-18
    • 2016-11-08
    • 2022-01-15
    • 2019-07-15
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多