object - 哈希的代理对象?

标签 object hash proxy raku

如何为哈希创建代理对象?我似乎找不到传递哈希键的方法:

#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;

最佳答案

一个 Proxy是单个容器 aka Scalar 的替代品.一个 Hash是复数容器,其中每个元素默认为 Scalar .

一种可能的解决方案(基于 How to add subscripts to my custom Class in Perl 6? )是委托(delegate) 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}

关于object - 哈希的代理对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58088825/

相关文章:

algorithm - 具有复合键的 Cassandra 哈希算法

proxy - 强制youtube通过squid中的cache_peer进行缓存

wpf - 如何像代理一样使用Binding?

python - 为什么这个 python 类实例是可哈希的?

ruby - Ruby 中的方法 : objects or not?

javascript - 我在 for 循环内得到相同的对象以进行 Angular 修改

javascript - 只要对象属性不为 NaN,就将对象推送到数组

javascript - 如何跟踪 javascript 行为的起源,特别是 - 将哈希添加到我的 url

linux - nginx 作为缓存代理不缓存任何东西

javascript - 如何从对象 : Javascript 中获取保存对象实例的变量名