Различие заключается в том, что другие сборки, скомпилированные с кодом, который считывает свойство, скомпилированы против свойства.
Если позже вы решите, что вам нужно добавить код в getter или setter, вы можете сделать это, не вынуждая каждую связанную с ним сборку перекомпилировать.
Не так с полями. Если впоследствии вы измените поле как свойство, чтобы добавить этот код, другие сборки, связанные с вашим, перестанут функционировать должным образом, поскольку они скомпилированы для чтения поля, а не свойства.
Кроме того, много кода написано для поиска свойств, а не полей, таких как привязка данных и т. Д.
Да. При передаче Параметра отладки Template->new
TT предупредит Вас о неопределенных значениях.
См. документы здесь: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod
Вы ищете:
DEBUG_UNDEF
Эта опция заставляет Шаблонный Инструментарий бросать 'undef' ошибку каждый раз, когда это встречается со значением неопределенной переменной.
use Template::Constants qw( :debug );
my $template = Template->new({
DEBUG => DEBUG_UNDEF,
});
(От [1 121] http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod .)
, Если Вы хотите сделать некоторую специальную обработку исключения, Вам будет нужно , чтобы поймать его или заменить __DIE__
обработчик сигналов .
Позволяют нам соединить его:
#!/usr/bin/perl
use strict;
use warnings;
use Template;
use Template::Constants qw( :debug );
my $debug_tt = Template->new({
DEBUG => DEBUG_UNDEF,
});
my $tt = Template->new();
my $vars = {
something => "42",
};
my $template = <<EOF;
First something undefined: [% nothing %].
And now something defined: [% something %].
EOF
my $output = '';
eval {$debug_tt->process(\$template, $vars, \$output)};
warn $debug_tt->error() if $debug_tt->error();
$tt->process(\$template, $vars);
вывод:
undef error - nothing is undefined
First something undefined: .
And now something defined: 42.
Мой подход должен был использовать два различных экземпляра Шаблонного класса:
$debug_tt
, который имеет DEBUG_UNDEF
включенный флаг и скрывает его вывод в $output
переменная.
$tt
, который является ванильным экземпляром и печатает его вывод к STDOUT
, как значение по умолчанию.
Оба экземпляра используют тот же шаблон, сохраненный в [1 110] и тот же переменный хеш, сохраненный в [1 111]. $debug_tt
обертывается в eval
, чтобы не выходить преждевременно, и предупреждение испускается, если $debug_tt->error()
верно. $tt
обычно выполняется. Я думаю, что это удовлетворяет Ваши основные требования, хотя это, вероятно, не эффективно. Мы должны проанализировать $template
дважды использование этого метода.
Некоторые мысли у меня была работа над этим:
было бы хорошо, если бы Template::Toolkit
использовал Carp
так, чтобы мы могли получить немного больше контекста на предупреждении.
можно было, вероятно, получить класс из Шаблона, который будет warn
вместо [1 120] на ошибке. Я не испытывал желание делать это.
В зависимости от того, как Ваши шаблоны настраиваются, могло бы иметь смысл подавать его в одной строке за один раз так, чтобы Вы могли испустить номера строки, когда неопределенное значение найдено.
должно быть возможно изменить шаблоны, чтобы протестировать на их собственные ошибки и испустить более разумный текст перед лицом неопределенных значений.