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