这是我尝试解决每周挑战#2的尝试。
挑战非常模糊,因此我决定尝试使用内存实现标量值。我对容器的工作方式的理解可能是有缺陷的,但我真正不了解的是,为什么say self.VAR.WHAT
是a Proxy
而不是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]
Run Code Online (Sandbox Code Playgroud)
这并不能帮助您获得所需的功能,但是暂时可以回答您的特定问题:
说出self.VAR.WHAT; #为什么这个“代理”而不是“ HistoryProxy”?
我认为这是因为Proxy
当前未将类设置为子类。它的new
方法基本上用a Proxy.new
代替a self.new
,所以它错过了子类化。现在看。
self.VAR.SAVE($ c-value); #为什么这不起作用?
self
是始终 decontainerized。因此,您始终会看到潜在价值。如果要使用实际的对象,则需要更改的签名method
,例如:
STORE => method (\SELF: T $new-value) {
Run Code Online (Sandbox Code Playgroud)
然后使用:
SELF.VAR
Run Code Online (Sandbox Code Playgroud)
但是由于该对象实际上并没有作为子类得到祝福,因此无论如何对您没有多大帮助。
更新:https : //github.com/rakudo/rakudo/pull/3196Proxy
将来应该允许对象的子类化。
更新:使用https://github.com/rakudo/rakudo/commit/d00674b31c合并了此请求请求。它应该在2019.11 Rakudo编译器版本中可用。