Forum Webscript.Ru

Программирование => Perl => Тема начата: Oleg111 от 13 Сентября 2003, 14:18:58

Название: Не разберусь в примере из учебника.
Отправлено: Oleg111 от 13 Сентября 2003, 14:18:58
В одном из учебников Perl в теме «Прегрузка» встречаю такой код:
  package  PsychoHash;
  use overload ‘%{}’ => \\&as_hash;
  sub as_hash {
    my ($x) = shift;
    return { @$x };
}
sub new {
   my $class = shift;
   return bless [ @_ ] => $class;
}
$critter = new  PsychoHash( height => 72, weight => 365, type => “camel” );
print $critter->{weight};   #prints 365

Пример показывает реализацию объекта как анонимного массива, разрешающего ссылку через хеш. Я не пойму что происходит в обработчике  as_hash:
1)   my ($x) присваевается инвокант объекта $critter (в качестве первого аргумента любого объекта);
2)   далее возвращается анонимный хеш значениями которого являются значения массива @x.
3)   и как из всего этого print выводит число 365, неясно.
 То есть я догадываюсь, что {weight} является ключом в анонимном хеше, который должен там вернуть свое значение, которым является 365. Но как это конкретно происходит в  as_hash не пойму.  Короче, что  присваевается  ($x) и что возвращает { @$x }.
   Вроде все.
   Спасибо.
Название: Не разберусь в примере из учебника.
Отправлено: arto от 13 Сентября 2003, 18:02:09
# perl -de0
  DB<1> @a = qw(a 1 b 2 c 3)

  DB<2> (%b) = @a

  DB<3> p $b{b}
2
Название: Не разберусь в примере из учебника.
Отправлено: Oleg111 от 14 Сентября 2003, 00:17:18
В вашем коде мне все ясно, но я хотел бы разобраться в своем.
Название: Не разберусь в примере из учебника.
Отправлено: Chs от 15 Сентября 2003, 12:05:25
Цитировать
В вашем коде мне все ясно, но я хотел бы разобраться в своем.

А таки есть разница?:)
Название: Не разберусь в примере из учебника.
Отправлено: Oleg111 от 15 Сентября 2003, 15:14:35
Просто надо же понимать такие вещи.
Название: Не разберусь в примере из учебника.
Отправлено: mike от 15 Сентября 2003, 16:41:44
Цитировать
Oleg111:
Короче, что присваевается ($x) и что возвращает { @$x }.

1) $x присваивается ссылка на экземпляр класса PsychoHash. Грубо говоря - это ссылка на массив, которая была передана bless в качестве аргумента.

2) return { @$x }: возвращается ссылка на анонимный хеш, состоящий из значений массива @$x.
Название: Не разберусь в примере из учебника.
Отправлено: Oleg111 от 16 Сентября 2003, 09:06:00
Ясно. Просто я думал, что первый аргумент любого объекта - его инвокант. Наверно это только при создании объекта первым аргументом передаваемом конструктору будет его класс, а потом при использовании объекта первым будет то что передано ему (объекту) в качестве значения в конструкторе, в данном случае это сссылка на анонимный хеш. Я правильно все понял?
 Спасибо.