Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 }.
Вроде все.
Спасибо.
-
# perl -de0
DB<1> @a = qw(a 1 b 2 c 3)
DB<2> (%b) = @a
DB<3> p $b{b}
2
-
В вашем коде мне все ясно, но я хотел бы разобраться в своем.
-
В вашем коде мне все ясно, но я хотел бы разобраться в своем.
А таки есть разница?:)
-
Просто надо же понимать такие вещи.
-
Oleg111:
Короче, что присваевается ($x) и что возвращает { @$x }.
1) $x присваивается ссылка на экземпляр класса PsychoHash. Грубо говоря - это ссылка на массив, которая была передана bless в качестве аргумента.
2) return { @$x }: возвращается ссылка на анонимный хеш, состоящий из значений массива @$x.
-
Ясно. Просто я думал, что первый аргумент любого объекта - его инвокант. Наверно это только при создании объекта первым аргументом передаваемом конструктору будет его класс, а потом при использовании объекта первым будет то что передано ему (объекту) в качестве значения в конструкторе, в данном случае это сссылка на анонимный хеш. Я правильно все понял?
Спасибо.