Pregunta

Vi algo de código en TCL como este:

namespace eval ::info {
    set count 0;
    set id 1;
    set role admin;

    namespace export *
}



proc ::info::setcount {
    set ::info::count 0;
}

proc ::info::setId {
    set ::info::id 1;
}

proc ::info::setRole {
    set ::info::role user;
}

Hay tres variables que se definen en el espacio de nombres ::info, pero que tres de los procs(setcount setId setRole) no son declarados en el espacio de nombres, parece que se definen fuera de ::info, es esto permitido?¿cómo funciona esto?

¿Fue útil?

Solución

Los procedimientos son se define en el ::info espacio de nombres.Simplemente no están dentro del alcance de la namespace eval, un comando que crea el espacio de nombres si es necesario y, a continuación, ejecuta el script determinado dentro de ese contexto.Se ejecuta en el contexto de un espacio de nombres cambios ¿ proc lugares a los comandos que se crea cuando los nombres de los comandos no están plenamente cualificados.El espacio de nombres existe independientemente de la namespace eval de la llamada.Las variables deben ser declaradas en el espacio de nombres aunque;que evita algunos realmente desagradable problemas con la resolución de las variables que pueden atrapar a la gente.

Personalmente, prefiero escribir un código como este:

namespace eval ::foo {
    proc bar ... {
        ...
    }
}

Pero sé que otras personas no están de acuerdo conmigo.Escriba lo que usted prefiere, como Tcl funciona correctamente con cualquier programa.

Otros consejos

El namespace eval comando

  1. Crea el espacio de nombres si no existe
  2. Ejecuta el código proporcionado a él desde dentro de ese espacio de nombres

Procedimientos definidos dentro de un espacio de nombres (que es todos los procs, desde el espacio de nombres predeterminado es ::)

  • Si precedido por una absoluta espacio de nombres, se define que el comando en el espacio de nombres especificado
  • Si va precedido por un relativo espacio de nombres, se define que el comando relativa al espacio de nombres actual

Como tal

namespace eval bob {
    namespace eval joe {
        proc proc1 {} {}
    }
    proc proc2 {} {}
    proc ::proc3 {} {}
    proc joe::proc4 {} {}
}
proc proc5 {} {}
proc bob::joe::proc6 {} {}
proc ::bob::joe::proc7 {} {}

Los siguientes comandos de existir

::bob::joe::proc1
::bob::proc2
::proc3
::bob::joe::proc4
::proc5
::bob::joe::proc6
::bob::joe::proc7

Observe que los comandos en el espacio de nombres global, cuando se llama desde el espacio de nombres global, puede ser precedida por un :: o no.Lo mismo es cierto de comandos en cualquier espacio de nombres.

namespace eval bob {
    proc2 ;# calls ::bob::proc2
    ::proc5 ;# calls ::proc5 (proc5 in the global namespace)
    joe::proc4 ;# calls ::bob::joe::proc4
}

Vale la pena señalar que un raw nombre de comando (con ningún espacio de nombres clasificatorios en todos) se verá en el espacio de nombres actual y, a continuación, si no encuentra el mando allí, el espacio de nombres global.

namespace eval bob {
    proc5 ;# calls ::proc5 since there is no ::bob::proc5
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top