gpt4 book ai didi

raku - 带内存的标量,或如何正确 `tie`

转载 作者:行者123 更新时间:2023-12-04 12:02:44 27 4
gpt4 key购买 nike

这是我试图解决 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]

最佳答案

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

say self.VAR.WHAT; # Why is this "Proxy" and not "HistoryProxy"?



我想这是因为 Proxy类当前未设置为子类。它的 new方法基本上做了一个 Proxy.new而不是 self.new ,所以它错过了子类化。现在正在考虑。

self.VAR.SAVE( $c-value ); # Why does this not work?


self总是 拆箱。所以你总是看到潜在的值(value)。如果您想拥有实际对象,则需要更改 method 的签名。 ,例如:
STORE => method (\SELF: T $new-value) {

然后使用:
 SELF.VAR

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

更新: https://github.com/rakudo/rakudo/pull/3196应该允许 Proxy 的子类化 future 的对象。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com