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

挑战非常模糊,因此我决定尝试使用内存实现标量值。我对容器的工作方式的理解可能是有缺陷的,但我真正不明白的是,即使我明确地说了为什么say self.VAR.WHATProxy而不是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]

最佳答案

这并不能帮助您获得所需的功能,但是它确实可以回答您的特定问题:



我认为这是因为Proxy类当前未设置为可子类化。它的new方法基本上执行Proxy.new而不是self.new,因此它错过了子类化。现在看。


self始终为取消包装的。因此,您始终会看到潜在的值(value)。如果您想拥有实际的对象,则需要更改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编译器版本中可用。

关于raku - 具有内存的标量,或如何正确 `tie`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58055309/

10-12 17:47