Tcl: Разница между различными способами добавления класса экземпляра - PullRequest
0 голосов
/ 05 марта 2020

Я нашел два способа создания экземпляра класса:

Один из них:

class_name create instance
instance class_method

Другой:

set instance [class_name new]
$instance class_method

Каждый способ работал хорошо, так что есть какая разница между двумя способами?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Единственное отличие состоит в том, что метод new в классах генерирует для вас уникальное имя, а с помощью метода create вы можете указать, какое это имя. Оба предоставляются, потому что есть варианты использования для каждого из них. Используйте то, что имеет смысл для вас. (Обратите внимание, что сами объекты классов всегда называются из-за того, как они обычно используются, и поэтому вы не можете обычно создавать классы с new; это скрыто в oo::class экземплярах.)

Ради для полноты, есть еще один способ создания экземпляров, createWithNamespace, который позволяет вам также указать имя пространства имен состояния объекта. Он не выставлен по умолчанию (вы должны export вручную его использовать для общего пользования) и довольно хорош для людей, которые не занимаются глубокими махинациями. Вы, вероятно, не хотите его использовать.

В какой-то момент в будущем new может быть улучшен, так что он также включает сборку мусора для объекта, тогда как create не будет (потому что вы знаете, что имя вне группы). В частности, я написал TIP для этого для Tcl 9.0, но у меня пока нет работающей реализации, поэтому не задерживайте дыхание.

0 голосов
/ 05 марта 2020

Я пытался в некоторых случаях,

класс определяется следующим образом:

oo::class create class_name {
    variable text
    method add {t} { set text $t }
    method print { } { puts $text }
}

Первый способ:

class_name create foo
foo add "abc"
foo print

class_name create foo

Возвращается:

abc
Error: can't create object "foo": command already exists with that name

Второй способ:

set foo [class_name new]
$foo add "abc"
$foo print

set foo [class_name new]
$foo add "def"
$foo print

Он вернется:

abc
def

Это одно различие, которое я нашел, и похоже, что secnod way больше удобно.

Все еще ожидая, что мастер предоставит достоверные ответы или документы.

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