Incr Tcl объектов в списке / массив / Dict - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь создать несколько объектов, используя 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
creating new router R1 / fwe2165 within JitixNet
creating new router R2 / dagsyu2 within JitixNet
creating new router R3 / fasdjg3 within JitixNet
bad option "get_name": should be one of...
  router0 add_interface name network_id
  router0 cget -option
  router0 configure ?-option? ?value -option value...?
  router0 get_interfaces
  router0 get_mac{} return $mac;
  router0 get_name{} return $name;
  router0 get_topology
  router0 isa className
    while executing
"$router get_name"
    (object "::t" method "::topology::show" body line 4)
    invoked from within
"t show"
    (file "network-topology.tcl" line 142)

Может кто-нибудь помочь, пожалуйста? Я в своем уме ... Честно говоря, я ожидал, что ITcl будет чем-то похожим на Java ...

1 Ответ

3 голосов
/ 31 января 2012

Проблема в том, что вам нужно поставить пробел между именами методов и (пустым) списком параметров.Это нормально для команд в Tcl (вы должны сделать то же самое, если объявите стандартную процедуру Tcl).

Руководство по диагностике

Если вы посмотрите на сообщение об ошибке, вы можете увидетьчто одним из «разрешенных способов его вызова» является:

get_name{} return $name; 

Это очень нечетное имя и явно нечетный набор параметров.Быстрый взгляд на код подтверждает отсутствие пробела.(Это не ошибка из-за особенностей того, как ITcl обрабатывает частичные объявления. Меня это не особо волнует, но это становится не по теме…)

...