Как вы понимаете трюк здесь? - PullRequest
5 голосов
/ 12 июля 2011
my $self; { my %hash; $self = bless(\%hash, $pkg); }

Это цитата из HTML/Template.pm, почему бы просто не bless $self,$pkg?

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Я думаю, что целью было ограничить область действия %hash ограничивающим блоком. Это может быть переписано как:

my $self = bless {}, $pkg;
1 голос
/ 12 июля 2011
 $hash  =   {};
 ^^^^^      ^^
referrer referent

В следующем выражении:

$self = bless( $hash, $pkg );

bless помечает референт (анонимный хеш), на который ссылается $hash, как объект $pkg (класс HTML :: Template).Он не изменяет переменную $hash.

Функция bless возвращает ссылку на благословенный анонимный хеш.$self, следовательно, становится ссылкой на благословенный анонимный хеш (референт).

Важно помнить, что если первый аргумент функции bless является ссылкой, то это вещь, к которойэто относится к благословению, а не к самой переменной:

$self = bless( $self, $pkg );

$self ни к чему не относится - это undef.Нет ссылки на благословение.Это равносильно попытке сделать это:

$self = bless( undef, $pkg );

Благослови моих референтов дает отличное введение в предмет.

0 голосов
/ 12 июля 2011

Поскольку $self равно undef - почти эквивалентно будет:

my $self ={}; { $self = bless($self, $pkg); }

Или:

$self = bless( {}, $pkg);

Редактировать , чтобы ответить на комментарий:

Вы не можете благословить undef, потому что вы получите ошибку Can't bless non-reference value at .... Это потому, что только жесткие ссылки могут быть благословлены. Вот как Perl обеспечивает инкапсуляцию объектов. См. Справочную страницу perlobj .

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