Прокси-объект для хеша? - PullRequest
       28

Прокси-объект для хеша?

5 голосов
/ 25 сентября 2019

Как сделать объект Proxy для хеша?Я не могу найти способ передать в хэш-ключе:

#sub attr() is rw {
sub attr($name) is rw {
  my %hash;
  Proxy.new(
    FETCH => method (Str $name) { %hash«$name» },
    STORE => method (Str $name, $value) { %hash«$name» = $value }
  );
}

my $attr := attr();
$attr.bar = 'baz';
say $attr.bar;

1 Ответ

5 голосов
/ 25 сентября 2019

A Proxy является заменой единственного контейнера aka Scalar.Hash - это множественный контейнер, где каждый элемент по умолчанию является Scalar.

Возможное решение (на основе Как добавить подписки в мой пользовательский класс в Perl 6? )должен делегировать реализацию Associative внутреннему хешу, но переопределить метод AT-KEY, чтобы заменить Scalar по умолчанию на Proxy:

class ProxyHash does Associative {

  has %!hash handles
    <EXISTS-KEY DELETE-KEY push iterator list kv keys values gist Str>;

  multi method AT-KEY ($key) is rw {
    my $element := %!hash{$key};
    Proxy.new:
      FETCH => method ()       { $element },
      STORE => method ($value) { $element = $value }
  }
}

my %hash is ProxyHash;
%hash<foo> = 42;
say %hash; # {foo => 42}
...