Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> weaken 
:(
    Опции темы
gcc
Дата 25.3.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



видел несколько частей кода с применением Scalar::Util, там дополнительный возможности работы с хэшами массива и т.д.

не понимаю где надо применять этот weaken  какой смысл от них, то есть это цыклическая ссылка, но как она передается? там можно прицепить любой метод при наследовании наверное?

хочется, узнать зачем это - может пригодиться...

Код

$main->{obj1} = MainClass::SubClass1->new($main);
# в методе new MainClass::SubClass1
package MainClass::SubClass1;
use Scalar::Util;
sub new {
    $class = shift;
    bless $self, $class;
    $self->{'main'} = shift;
    Scalar::Util::weaken( $self->{'main'} )
        if ref $self->{'main'};    # weaken circular reference
    $self->{'ua'} = MainClass::Uni::LWP->new($self->{'main'}->{myconst});
}



Код

sub comment : Path {
    my ( $self, $c ) = @_;
 
    eval {
        $self->find_by_uri_path($c);
    };
    
    $c->detach('/not_found')
      if $@ ||
         !defined $c->stash->{comment} ||
         !blessed $c->stash->{comment} ||
         !$c->stash->{comment}->isa('Angerwhale::Content::Item');


Код

sub _on_same_day {
    my ( $a, $b ) = @_;
 
    return 0 if !blessed($a) || !blessed($b);
 
    my @a = ( localtime( $a->creation_time ) )[ 3, 4, 5 ];
    my @b = ( localtime( $b->creation_time ) )[ 3, 4, 5 ];
 
    return ( $a[0] == $b[0] )
      && ( $a[1] == $b[1] )
      && ( $a[2] == $b[2] );
}
 



PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 26.3.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



gcc, предположим у тебя есть объект UsersGroup у него есть свойство users, в котором хранится массив ссылок на объекты User. В объекте User есть поле group, в котором хранится ссылка на объект UsersGroup. Т.е. получаем взаимные ссылки, которые не позволять освободить память, занятую объектами после удаления всех остальных ссылок на них (дестукторы объектов помочь не могут, т.к. они не вызываются). В подобных случаях помогают "слабые" ссылки. В нашем случае мы сделаем слабой ссылку на объект UsersGroup в объекте User. При создании слабой ссылки счетчик ссылок у объекта User не увеличивается. Это приводит к тому, что при удалении всех остальных ссылок, кроме слабой объект уничтожается. Это нужно иметь ввиду при выборе кандидата на слабую ссылку. 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 26.3.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(ginnie @ 26.3.2009,  12:43)
При создании слабой ссылки счетчик ссылок у объекта User не увеличивается. Это приводит к тому, что при удалении всех остальных ссылок, кроме слабой объект уничтожается. Это нужно иметь ввиду при выборе кандидата на слабую ссылку.

понял, мне показалось что это что-то другое

А если сделать копию объекта UsersGroup и название его по другому, или что-то примерно этого, то тогда можно и не использовать weaken... наверное, попробую тогда когда будет такая задача


PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 26.3.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Приведу пример:

Код

#!/usr/bin/perl

use strict;
use warnings;

use Scalar::Util;

use Devel::Leak::Object qw(GLOBAL_bless);

my $group = UsersGroup->new();
$group->add_user(User->new());

print $group->get_users()->[0]->get_group()->get_name(), $/;
undef $group;

package UsersGroup;

sub new {
    my $class = shift;
    return bless { name => 'Test', users => [] }, $class;
}

sub add_user {
    my ($self, $user) = @_;
    push(@{$self->{users}}, $user);
#    Scalar::Util::weaken($self->{users}->[-1]); # делаем ссылку слабой
    $user->set_group($self);
    return 1;
}

sub get_name {
    return shift->{name};
}

sub get_users {
    return shift->{users};
}

package User;

sub new {
    my $class = shift;
    return bless { group => undef }, $class;
}

sub set_group {
    my ($self, $group) = @_;
    $self->{group} = $group;
#    Scalar::Util::weaken($self->{group}); # делаем ссылку слабой
    return 1;
}

sub get_group {
    return shift->{group};
}


В примере я использую модуль Devel::Leak::Object, который показывает объекты, остающиеся после автоматической "сборки мусора" интерпретатором.
Без использования слабой ссылки мы получаем

Код

Test
Tracked objects by class:
User                                     1
UsersGroup                               1


т.е. в памяти осталось два объекта: один класса UsersGroup, второй - User.

После раскомментирования строки создания слабой ссылки в классе User получаем:

Код

Test
Tracked objects by class:


т.е. никаких объектов в памяти не остается.

Если же мы сделаем слабой ссылку на объект User в классе UsersGroup, то получим

Код

Can't call method "get_group" on an undefined value at weaken_test.pl line 13.
Tracked objects by class:


т.к. никаких ссылок, кроме слабой на объект User нет, он уничтожается сразу после создания слабой ссылки, о чем свидетельствует сообщение об ошибке.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.