Как передать указатель на контейнер из функции?

#raku

#raku

Вопрос:

Я могу привязать контейнеры к новым именам:

 my %h;
my $p := %h{ "a" }{ "b" }{ "c" };
$p = 1;
say %h;
 

Какие ожидаемые результаты:

 {a => {b => {c => 1}}}
 

Но что, если мне нужно вернуть такой указатель из подпрограммы?

 my %h;
sub get-pointer {
    my $p := %h{ "a" }{ "b" }{ "c" };
    return $p;
};
my $q := get-pointer();
$q = 1;
say %h;
 

Дает:

 Cannot assign to a readonly variable or a value
 

Эта вещь меня озадачивает — $p.WHERE и $q.WHERE дает тот же адрес, так почему же он вдруг доступен только для чтения?

Ответ №1:

Неважно, у меня был некоторый момент туннельного видения, и я хотел, чтобы псевдонимы вели себя как указатели C.

Нашел четкое объяснение здесь, в документации Raku.

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

Чтобы вернуть изменяемый контейнер, используйте return-rw .