Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> роль фигурной скобки 
:(
    Опции темы
Aleshka
Дата 21.2.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 10.12.2007
Где: Харьков

Репутация: нет
Всего: нет



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

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


PM MAIL ICQ   Вверх
ginnie
Дата 21.2.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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

Код

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


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

Это сообщение отредактировал(а) ginnie - 21.2.2008, 18:21


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Aleshka
Дата 21.2.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 10.12.2007
Где: Харьков

Репутация: нет
Всего: нет



Цитата

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

А можно немного подробней об этом рассказать. Т.е если это не ссылка на хэш, то как мы можем скалярной переменной присваивать целый список??? Или мы в перемеенную $self заносим адрес на анонимный хэш. Так? 
И зачем тогда такие сложности из хэша делают список чтобы затем опять представить его в анонимный хэш. Я perl-код взял из книги, просто мне это стало непонятно назначение {}. Но хотелось бы узнать для чего мне это может быть полезно обычный хеш преобразовывать в анонимный??
PM MAIL ICQ   Вверх
ginnie
Дата 21.2.2008, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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

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

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

P.S. Вариант

Код

return bless (\%attr, $class);

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

Это сообщение отредактировал(а) ginnie - 21.2.2008, 19:57


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Aleshka
Дата 22.2.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 10.12.2007
Где: Харьков

Репутация: нет
Всего: нет



Цитата

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

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

Это сообщение отредактировал(а) Aleshka - 22.2.2008, 10:00
PM MAIL ICQ   Вверх
ginnie
Дата 22.2.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Высказывание значит, что если выполнить код

Код

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


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


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Aleshka
Дата 22.2.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 10.12.2007
Где: Харьков

Репутация: нет
Всего: нет



Понял, спасибо.
PM MAIL ICQ   Вверх
ginnie
Дата 24.2.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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

Фрагмент 
Код

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

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

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

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




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.