Копировать при записи для ссылок - PullRequest
0 голосов
/ 13 июня 2018

Perl в настоящее время поддерживает Копировать при записи (CoW) для скалярных переменных, однако для хэш-функций и массивов-ссылок у него ничего нет.

Однако в Perl есть подпрограммы для изменениявнутренние переменные, такие как слабый , поэтому я предполагаю, что может существовать решение.

У меня есть ситуация, когда у меня большая структура, которую я возвращаю из пакета, который сохраняет внутреннее состояниеэтой большой структуры.Я хочу убедиться, что, если либо возвращенные ссылки, либо внутренняя ссылка (которые в настоящее время являются одной и той же ссылкой) будут изменены, я получу ситуацию копирования при записи, когда данные, на которые ссылаются ссылки, копируются, изменяются иссылка, используемая для изменения данных, обновляется, чтобы указывать на новые данные.

package SomePackage;
use Moose;

has some_large_internal_variable_ref => (
    'is'  => 'rw',
    'isa' => 'HashRef',
);

sub some_operation {
    my ($self) = @_;
    $self->some_large_internal_variable_ref({
        # create some large result that is different every time
    });
}

sub get_result {
    my ($self) = @_;
    return $self->some_large_internal_variable_ref;
}

1;

use strict;
use warnings;
use SomePackage;
use Test::More;

# Situtation 1 where the internally stored reference is modified
# This will pass!

my $package = SomePackage->new();
$package->some_operation();
my $result1 = $package->get_result();

$package->some_operation();
my $result2 = $package->get_result();

isnt($result1, $result2, "These two references should no longer be the same");


# Situtation 2 where the externally stored references is modified
# This will fail

$package = SomePackage->new();
$package->some_operation();
$result1 = $package->get_result();
$result1->{foo} = "bar";

$result2 = $package->get_result();

isnt($result1, $result2, "These two references should no longer be the same");

done_testing;

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

Я надеюсь, что есть какая-то форма weaken, я могу вызвать переменную, чтобы указать, что, если будет произведена модификация для поведения с копированием при записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...