Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > роль фигурной скобки


Автор: Aleshka 21.2.2008, 18:03
Не пойму назначение фигурных в коде а имеено в строке $self= {%attr}, как я понимаю это нужно для создания символической ссылки %attr. 
Я прав?
Код

sub new {
my $class = shift;
my %attr=@_;
my $self = { %attr };
return bless ($self, $class);
}


Автор: ginnie 21.2.2008, 18:11
Нет, это создается анонимный хеш. {%attr} означет, что надо хеш представить в виде списка и из полученного списка создать анонимный хэш.
Если обработка параметров не планируется, то лучше написать

Код

sub new {
    my $class = shift;
    my $self = { @_ };
    return bless ($self, $class);
}


Сам я всегда указываю свойства класса явно, кроме этого использую модуль Hash::Util (функции lock_keys unlock_keys), чтобы выявлять ошибки при неверном написании имени свойства.

Автор: Aleshka 21.2.2008, 19:45
Цитата

надо хеш представить в виде списка и из полученного списка создать анонимный хэш

А можно немного подробней об этом рассказать. Т.е если это не ссылка на хэш, то как мы можем скалярной переменной присваивать целый список??? Или мы в перемеенную $self заносим адрес на анонимный хэш. Так? 
И зачем тогда такие сложности из хэша делают список чтобы затем опять представить его в анонимный хэш. Я perl-код взял из книги, просто мне это стало непонятно назначение {}. Но хотелось бы узнать для чего мне это может быть полезно обычный хеш преобразовывать в анонимный??

Автор: ginnie 21.2.2008, 19:55
Можно и поподробнее: в переменную $self мы заносим ссылку на анонимный хеш. Делаем мы это для того, чтобы функция new() возвращала объекты, содержащие разные хеши (т.е. хеши, расположенные в памяти по разным адресам).
Если написать
Код

my %self = %attr;
return bless (\%self, $class);

то при втором вызове new() интерпретатор выдаст сообщение об ошибке, т.к. \%self уже сопоставлена классу.

P.S. Вариант

Код

return bless (\%attr, $class);

аналогичен приведенному выше.

Автор: Aleshka 22.2.2008, 09:56
Цитата

функция new() возвращала объекты, содержащие разные хеши (т.е. хеши, расположенные в памяти по разным адресам).

А что значит данное высказывание. Это что элементы хеша распологаются по разным адресам?? Т.е мы подрозумеваем хеш хешей, так?

Автор: ginnie 22.2.2008, 10:06
Высказывание значит, что если выполнить код

Код

my $object1 = Class->new( name => 'test1' );
my $object2 = Class->new( name => 'test2' );


$object1 и $object2 будут указывать на разные хэши в памяти.

Автор: Aleshka 22.2.2008, 12:06
Понял, спасибо.

Автор: ginnie 24.2.2008, 23:35
Aleshka, приношу глубочайшие извинения, что ввел в заблуждение!  smile 

Фрагмент 
Код

my %self = %attr;
return bless (\%self, $class);

отработает нормально, без каких-либо ошибок. Я полагал, что \%self будет при каждом вызове возвращать один и тот-же адрес в памяти (т.е. ссылку на один и тот-же хэш). Это не так. my %self всегда создает новый хеш в памяти.
Код
Код

sub new {
    my $class = shift;
    my %self = @_;
    return bless (\%self, $class);
}

должен работать без проблем.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)