Автор Тема: Не разберусь в примере из учебника.  (Прочитано 3561 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Oleg111

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Не разберусь в примере из учебника.
« : 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

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Не разберусь в примере из учебника.
« Ответ #1 : 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

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Не разберусь в примере из учебника.
« Ответ #2 : 14 Сентября 2003, 00:17:18 »
В вашем коде мне все ясно, но я хотел бы разобраться в своем.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Не разберусь в примере из учебника.
« Ответ #3 : 15 Сентября 2003, 12:05:25 »
Цитировать
В вашем коде мне все ясно, но я хотел бы разобраться в своем.

А таки есть разница?:)
2B OR NOT 2B = FF

Оффлайн Oleg111

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Не разберусь в примере из учебника.
« Ответ #4 : 15 Сентября 2003, 15:14:35 »
Просто надо же понимать такие вещи.

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Не разберусь в примере из учебника.
« Ответ #5 : 15 Сентября 2003, 16:41:44 »
Цитировать
Oleg111:
Короче, что присваевается ($x) и что возвращает { @$x }.

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

2) return { @$x }: возвращается ссылка на анонимный хеш, состоящий из значений массива @$x.
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн Oleg111

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Не разберусь в примере из учебника.
« Ответ #6 : 16 Сентября 2003, 09:06:00 »
Ясно. Просто я думал, что первый аргумент любого объекта - его инвокант. Наверно это только при создании объекта первым аргументом передаваемом конструктору будет его класс, а потом при использовании объекта первым будет то что передано ему (объекту) в качестве значения в конструкторе, в данном случае это сссылка на анонимный хеш. Я правильно все понял?
 Спасибо.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28