raku - 带有内存的标量,或者如何正确地“绑定”
问题描述
这是我解决每周挑战#2 的尝试。
挑战非常模糊,所以我决定尝试用内存实现标量值。我对容器应该如何工作的理解可能存在缺陷,但我真正不明白的是,为什么say self.VAR.WHAT
aProxy
而不是 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]
解决方案
这并不能帮助您获得所需的功能,但它现在确实回答了您的具体问题:
说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 编译器版本中可用。
推荐阅读
- android - java.lang.NoSuchMethodError:没有使用 Facebook SDK 的静态方法 getAPIVersion()
- ios - 在 UITableview // Swift 4.2 中自动布局多行标签
- r - 如何使用 R 将列表分成多列
- php - New to Ubuntu cant upload images to directory for webpage through xampp worked fine on windows
- node.js - 如何为nodejs离线安装mssql模块
- php - 具有多态关系的 Laravel 评论系统
- php - 我想从用户表 laravel 中选择我的余额“列”
- python-3.x - 如何让 WKHTMLTOPDF 在 Heroku 上工作?
- graphql - Apollo 和 AwsAppsync 在回调中重复突变
- wpf - 将图标添加到 WPF 中的动态菜单项