История изменений
Исправление
gh0stwizard,
(текущая версия)
:
Можно ли как-то вот этак сделать в Perl или категорически нельзя?
И можно и нельзя. В классическом ООП перла это нельзя, т.к. нету нужных средств. С помощью костылей это возможно, смотри caller(), import и AUTOLOAD. Этот вариант называется хаком, обходом привычного хода вещей. Вместо этого придумали Moo.
Кстати, хранение всех собственных данных объекта в каком-нибудь громадном хэше
Как человек с определенным опытом в этом вопросе, могу сказать, что перл хорошо оптимизирован на работу с хэшами хэшей. Но у него есть свои лимиты вложенности.
все эти многоуровневые индексы куда менее эффективны
Индекс строится для каждой структуры (хэш, массив) отдельно и эффективны также как и без вложенности.
$ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'}
Тут только проблема в цене разыменовывания. Если сделать по-классике, т.е. как в принято в Си, на котором написан перл:
my $hash_vars_a = $ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'};
for (keys %$hash_vars_a) {
my $value = $hash_vars_a->{$_};
...
}
my $options = delete $ObjectData{refaddr $self}{'options'};
# cleanup
$ObjectData{refaddr $self} = ();
%ObjectData = ();
undef %ObjectData; # Non-necessary: called explicity because we want this right now.
простые переменные
Верно. И велосипедить хэш, хэш-функции? За тебя люди уже постарались и делают это на отлично.
P.S. Проблема перла (тикля в том числе) при работе с хэшами и массивами только одна: оптимистичное выделение памяти (никогда не возращается в ОС) и размер минимальной длины значения. Последнее означает, что массив из 1 млн. чисел в 32 байта будет куда больше, чем ты ожидаешь. Решено, через XS (модуль Bit:Vector).
Исходная версия
gh0stwizard,
:
Можно ли как-то вот этак сделать в Perl или категорически нельзя?
И можно и нельзя. В классическом ООП перла это нельзя, т.к. нету нужных средств. С помощью костылей это возможно, смотри caller(), import и AUTOLOAD. Этот вариант называется хаком, обходом привычного хода вещей. Вместо этого придумали Moo.
Кстати, хранение всех собственных данных объекта в каком-нибудь громадном хэше
Как человек с определенным опытом в этом вопросе, могу сказать, что перл хорошо оптимизирован на работу с хэшами хэшей. Но у него есть свои лимиты вложенности.
все эти многоуровневые индексы куда менее эффективны
Индекс строится для каждой структуры (хэш, массив) отдельно и эффективны также как и без вложенности.
$ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'}
Тут только проблема в цене разыменовывания. Если сделать по-классике, т.е. как в принято в Си, на котором написан перл:
my $hash_vars_a = $ObjectData{refaddr $self}{'options'}{'user-defined'}{'var-a'};
for (keys %$hash_vars_a) {
my $value = $hash_vars_a->{$_};
...
}
my $options = delete $ObjectData{refaddr $self}{'options'};
# cleanup
$ObjectData{refaddr $self} = ();
%ObjectData = ();
undef %ObjectData; # Non-necessary: called explicity because we want this right now.
простые переменные
Верно. И велосипедить хэш, хэш-функции? За тебя люди уже постарались и делают это на отлично.