Forum Webscript.Ru

Программирование => Perl => Тема начата: Oleg111 от 09 Сентября 2003, 11:17:32

Название: Конструкторы объектов.
Отправлено: 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;

то есть без \\ перед переменой содержащей значение. Почему так?
Обычно это происходит в программах с использованием перегрузки. Это как то связано?
Спасибо
Название: Конструкторы объектов.
Отправлено: NeoNox от 09 Сентября 2003, 11:43:26
Давай сначала определим что ты подразумеваеш под
Цитировать

программами с использованием перегрузки
Название: Конструкторы объектов.
Отправлено: ondr от 09 Сентября 2003, 12:55:00
Цитировать
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 определяется как ссылка на анонимный хэш.
Название: Конструкторы объектов.
Отправлено: Oleg111 от 09 Сентября 2003, 16:16:00
Ответ №1 модератору NeoNox.
Я имею в виду программы в которых используется перегрузка операторов с помощью функции overload.
Название: Конструкторы объектов.
Отправлено: Oleg111 от 09 Сентября 2003, 16:25:34
Ответ №2 заглянувшему ondr.
 Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное. Я правильно понял?
Название: Конструкторы объектов.
Отправлено: mike от 09 Сентября 2003, 17:12:51
Цитировать
Oleg111:
Мне неясно почему в некоторых конструкторах bless освещает ссылку в пакет задавая ссылку на эту ссылку.

Судя по документации к bless, в качестве первого аргумента можно передавать любую ссылку, в том числе и ссылку на скаляр, поэтому в приведенном синтаксисе нет ничего странного.

perldoc -f bless

Цитировать
Oleg111:
Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное.

Не факт, т.к. в основном при вызове bless используется ссылка на хеш. И если у тебя есть хеш, а не ссылка на него, то bless его нужно будет передать где-то так:
sub new {
  my ($class, $val) = @_;
  my %obj = ( \'property\'=>$val );
  return bless \\%obj, $class
}
Название: Конструкторы объектов.
Отправлено: ondr от 09 Сентября 2003, 17:18:12
Цитировать
Oleg111:
Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное. Я правильно понял?


Нет. Я имел в виду,что оператору bless, первым аргументом требуется символическая ссылка на какой-нибудь тип данных.
А что такое "\\", описанно здесь: perldoc perlref
Название: Конструкторы объектов.
Отправлено: Oleg111 от 09 Сентября 2003, 17:55:32
Все понятно. Спасибо.