Автор Тема: Конструкторы объектов.  (Прочитано 3669 раз)

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

Оффлайн Oleg111

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

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Конструкторы объектов.
« Ответ #1 : 09 Сентября 2003, 11:43:26 »
Давай сначала определим что ты подразумеваеш под
Цитировать

программами с использованием перегрузки
The documentations is your friend

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Конструкторы объектов.
« Ответ #2 : 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 определяется как ссылка на анонимный хэш.
0 OK, 0:1

Оффлайн Oleg111

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

Оффлайн Oleg111

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Конструкторы объектов.
« Ответ #4 : 09 Сентября 2003, 16:25:34 »
Ответ №2 заглянувшему ondr.
 Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное. Я правильно понял?

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конструкторы объектов.
« Ответ #5 : 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

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Конструкторы объектов.
« Ответ #6 : 09 Сентября 2003, 17:18:12 »
Цитировать
Oleg111:
Иными словами ссылка (\\) ставится если переменная ссылается на строку или число, и не ставится если она ссылается на массивы, хеши, подпрограммы и все остальное. Я правильно понял?


Нет. Я имел в виду,что оператору bless, первым аргументом требуется символическая ссылка на какой-нибудь тип данных.
А что такое "\\", описанно здесь: perldoc perlref
0 OK, 0:1

Оффлайн Oleg111

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Конструкторы объектов.
« Ответ #7 : 09 Сентября 2003, 17:55:32 »
Все понятно. Спасибо.

 

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