body
Имя
itcl::body — изменение тела для метода/процедуры классаСинтаксис
itcl::body className::function args bodyОписание
Команда body используется вне определения класса [incr Tcl] для определения или переопределения тела метода или процедуры класса. Эта возможность позволяет разделять «интерфейсную» и «реализационную» части определения класса. «Интерфейсная» часть — это команда class с объявлениями методов, процедур, переменных экземпляра и общих переменных. «Реализационная» часть — это набор команд body и configbody. Если «реализационную» часть хранить в отдельном файле, её можно многократно подключать при исправлении ошибок, чтобы поддерживать интерактивное развитие. При использовании режима «tcl» в редакторе emacs «интерфейсную» и «реализационную» части можно хранить в одном файле; при исправлении ошибок отдельные тела можно выделять и отправлять в тестовое приложение.Имя «className::function» идентифицирует изменяемый метод/процедуру.
Если при определении function в определении класса был указан список args, список args для команды body должен соответствовать по смыслу. Имена переменных могут меняться, но списки аргументов должны иметь одинаковые обязательные аргументы и одинаковые значения по умолчанию для необязательных аргументов. Специальный аргумент args действует как подстановочный знак, когда включён в список args в определении класса; он будет соответствовать нулю или более аргументам любого типа при переопределении тела.
Если строка body начинается с «@», она рассматривается как символическое имя C-процедуры. Список args имеет мало значения для C-процедуры, за исключением документации ожидаемого использования. (C-процедура не гарантирует использование аргументов таким образом.) Если body не начинается с «@», она рассматривается как сценарий команд Tcl. При вызове функции аргументы командной строки сопоставляются со списком args, и создаются локальные переменные для представления каждого аргумента. Это обычное поведение для процедуры в стиле Tcl.
Символические имена C-процедур устанавливаются путём регистрации процедур с помощью Itcl_RegisterC(). Это обычно делается в процедуре Tcl_AppInit(), которая автоматически вызывается при запуске интерпретатора. В следующем примере процедура My_FooCmd() регистрируется под символическим именем «foo». Эта процедура может быть упомянута в команде body как "@foo".
int
Tcl_AppInit(interp)
Tcl_Interp *interp; /* Interpreter for application. */
{
if (Itcl_Init(interp) == TCL_ERROR) {
return TCL_ERROR;
}
if (Itcl_RegisterC(interp, "foo", My_FooCmd) != TCL_OK) {
return TCL_ERROR;
}
} Пример
В следующем примере определяется класс «File» для представления открытых файлов. Тела методов включены ниже определения класса с помощью команды body. Обратите внимание, что тела конструктора/деструктора должны быть включены в определение класса, но их также можно переопределить с помощью команды body.itcl::class File {
private variable fid ""
constructor {name access} {
set fid [open $name $access]
}
destructor {
close $fid
}
method get {}
method put {line}
method eof {}
}
itcl::body File::get {} {
return [gets $fid]
}
itcl::body File::put {line} {
puts $fid $line
}
itcl::body File::eof {} {
return [::eof $fid]
}
#
# See the File class in action:
#
File x /etc/passwd "r"
while {![x eof]} {
puts "=> [x get]"
}
itcl::delete object x
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/body.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/body.htm