proc в Tcl oo :: class - PullRequest
       6

proc в Tcl oo :: class

0 голосов
/ 21 февраля 2019

глупый вопрос.У меня есть oo :: class и я создаю ужасную вещь - включая процы в конструктор и метод:

oo::class create MyClass {

    constructor {args} {
        proc silly {args} {
            puts "-------------silly's args: $args"
            puts namespace=[namespace current]
            set v [namespace current]::sillyvar
            puts $v=[incr $v]
            puts vars=[info vars [namespace current]::*]
        }
    }
    destructor {
        foreach proc {silly SILLY} {
            rename $proc ""
        }
    }
    method createprocs {} {
        proc SILLY {args} {
            puts "-------------SILLY's args: $args"
            set v [namespace current]::sillyvar
            puts $v=[incr $v]
        }
    }
    method another {} {
        silly ;# works ok
    }
}
MyClass create myobj
myobj createprocs
[info object namespace myobj]::silly hello world
myobj another
[info object namespace myobj]::SILLY HELLO WORLD
MyClass destroy

Вывод выглядит нормально:

-------------silly's args: hello world
namespace=::oo::Obj12
::oo::Obj12::sillyvar=1
vars=::oo::Obj12::sillyvar
-------------silly's args: 
namespace=::oo::Obj12
::oo::Obj12::sillyvar=2
vars=::oo::Obj12::sillyvar
-------------SILLY's args: HELLO WORLD
::oo::Obj12::sillyvar=3

Можете ли вы сказать, добрые люди, это правильно?И если да, то где это может быть полезно?

Что я вижу сейчас:

1) Глупый и Глупый оба «экспортированы».

2)Мне не нужны "мои глупые" и "глупые" я, чтобы получить доступ к глупому процессу от объекта.

1 Ответ

0 голосов
/ 21 февраля 2019

Можете ли вы, добрые люди, сказать, правильно ли это?

Мне кажется, все в порядке, за исключением того, что вам не нужен деструктор.Процедуры создаются в пространстве имен экземпляра объекта (в котором также находятся переменные объекта, FWIW), и оно автоматически удаляется при уничтожении объекта (и и наоборот ; вы не можете иметь его безother).

И если да, то где это может быть полезно?

Я использую процедуры (и другие команды), созданные внутри методов и конструкторов, довольно много.Они могут выполнять такие действия, как ведение частного суб-языка Tcl и т. Д. (Так же, как вы можете делать это, помещая команды в обычное пространство имен; это существенно не отличается), так что это действительно весьма полезно.Их также очень легко делегировать с помощью метода * 1013. * ed.

Один из самых простых приемов - создать подобъект внутри внешнего объекта и делегировать вызовы некоторых методов через:

oo::class create Outer {
    constructor {} {
        Inner create inner [self]
        puts "created [self]"
    }
    destructor {
        puts "destroyed [self]"
    }
    method foo {} {
        puts "this is foo of [self]"
    }
    forward bar  inner foo
}
oo::class create Inner {
    constructor {outer} {
        puts "created [self] inside $outer"
    }
    destructor {
        puts "destroyed [self]"
    }
    method foo {} {
        puts "this is foo of [self]"
    }
}

Демонстрируя это:

Outer create x
# ⇒ created ::oo::Obj13::inner inside ::x
# ⇒ created ::x
x foo
# ⇒ this is foo of ::x
x bar
# ⇒ this is foo of ::oo::Obj13::inner
x destroy
# ⇒ destroyed ::x
# ⇒ destroyed ::oo::Obj13::inner

Показывает сдерживание и делегирование на работе (которое основано на том же механизме, который использовались бы вашими процедурами).Как видите, inner создается внутри частного пространства имен x, а x bar маршрутизируется до inner foo.Еще лучше, когда x уничтожен, так же, как и inner без специального кода вообще;это очень полезно в сложном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...