Forum Webscript.Ru
Программирование => Perl => Тема начата: Oleg111 от 09 Сентября 2003, 11:17:32
-
Здравствуйте.
Мне неясно почему в некоторых конструкторах bless освещает ссылку в пакет задавая ссылку на эту ссылку.
Пример:
Package ShiftString;
use overload
‘>>’ => \\&right_shift,
‘ “” ‘ => sub { ${ $_[0] }};
sub new {
my $class = scift;
my $value = shift;
return bless \\$value => $class;
}
sub right_shift {
my ($x, $y) = @_;
my $value = $$x;
substr($value, -$y) = “”;
return bless \\$value => ref($x);
}
$camel = ShiftString->new(“Camel”);
$ram = $camel >> 2;
print $ram; #Cam
Хотя обычно ссылки освещаются по типу:
package Critter;
sub spawn {
my $self = {};
bless $self, “Critter”;
return $self;
}
$pet = Critter->spawn;
то есть без \\ перед переменой содержащей значение. Почему так?
Обычно это происходит в программах с использованием перегрузки. Это как то связано?
Спасибо
-
Давай сначала определим что ты подразумеваеш под
программами с использованием перегрузки
-
Oleg111:
Мне неясно почему в некоторых конструкторах bless освещает ссылку в пакет задавая ссылку на эту ссылку.
...
кусь
...
sub new {
my $class = scift;
my $value = shift;
return bless \\$value => $class;
}
В данном примере не наблюдается "освещения ссылки на ссылку". В переменную $value копируется значение аргумента и "освещается" уже ссылка на переменную $value.
Oleg111:
Хотя обычно ссылки освещаются по типу:
package Critter;
sub spawn {
my $self = {};
bless $self, “Critter”;
return $self;
}
В этом примере переменная $self определяется как ссылка на анонимный хэш.
-
Ответ №1 модератору NeoNox.
Я имею в виду программы в которых используется перегрузка операторов с помощью функции overload.
-
Ответ №2 заглянувшему ondr.
Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное. Я правильно понял?
-
Oleg111:
Мне неясно почему в некоторых конструкторах bless освещает ссылку в пакет задавая ссылку на эту ссылку.
Судя по документации к bless, в качестве первого аргумента можно передавать любую ссылку, в том числе и ссылку на скаляр, поэтому в приведенном синтаксисе нет ничего странного.
perldoc -f bless
Oleg111:
Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное.
Не факт, т.к. в основном при вызове bless используется ссылка на хеш. И если у тебя есть хеш, а не ссылка на него, то bless его нужно будет передать где-то так:
sub new {
my ($class, $val) = @_;
my %obj = ( \'property\'=>$val );
return bless \\%obj, $class
}
-
Oleg111:
Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное. Я правильно понял?
Нет. Я имел в виду,что оператору bless, первым аргументом требуется символическая ссылка на какой-нибудь тип данных.
А что такое "\\", описанно здесь: perldoc perlref
-
Все понятно. Спасибо.