首页 > 解决方案 > 带有内存的标量,或者如何正确地“绑定”

问题描述

这是我解决每周挑战#2 的尝试。

挑战非常模糊,所以我决定尝试用内存实现标量值。我对容器应该如何工作的理解可能存在缺陷,但我真正不明白的是,为什么say self.VAR.WHATaProxy而不是 a HistoryProxy,即使我明确这么说也是如此。

class HistoryProxy is Proxy
{
    has @!history;
    method HISTORY() { @!history };
    method SAVE( $value ) { @!history.push($value) }
}

sub historic(::T $type, $value) {
    my T $c-value = $value;
    return-rw HistoryProxy.new(
        FETCH => method () { $c-value },
        STORE => method (T $new-value) {
            say self.VAR.WHAT;         # Why is this "Proxy" and not "HistoryProxy"?
            self.VAR.SAVE( $c-value ); # Why does this not work?
            $c-value = $new-value;
        }
    );
}

my $a := historic(Int, 10);
$a = 12;
$a = 14;
say $a.VAR.HISTORY; #should print [10, 12]

标签: raku

解决方案


这并不能帮助您获得所需的功能,但它现在确实回答了您的具体问题:

说self.VAR.WHAT;# 为什么是“Proxy”而不是“HistoryProxy”?

我认为这是因为Proxy该类当前未设置为子类。它的new方法基本上是 aProxy.new而不是 a self.new,所以它错过了子类化。现在正在调查。

self.VAR.SAVE($c-value); # 为什么这不起作用?

self总是容器化。所以你总是看到潜在的价值。如果您想拥有实际对象,则需要更改 的签名method,例如:

STORE => method (\SELF: T $new-value) {

然后使用:

 SELF.VAR

但是由于该对象实际上并没有作为子类被祝福,所以无论如何这对您没有多大帮助。

更新:https ://github.com/rakudo/rakudo/pull/3196应该允许Proxy将来对对象进行子类化。

更新:与https://github.com/rakudo/rakudo/commit/d00674b31c合并了这个拉取请求。它应该在 2019.11 Rakudo 编译器版本中可用。


推荐阅读