最小代码:
#!/usr/bin/raku
class Widget {
submethod TWEAK(:$content, :$styles) {
say "t1\n";
}
}
class File is Widget {
submethod BUILD() {
say "b1";
}
}
my $xml = File.new();
Run Code Online (Sandbox Code Playgroud)
和输出:
t1
b1
Run Code Online (Sandbox Code Playgroud)
相关文档位于https://docs.raku.org/language/objects#Object_construction。我引用:“在调用 BUILD 方法之后,调用名为 TWEAK 的方法(如果存在),再次将所有命名参数传递给 new”。
我正在使用 Fedora 32 附带的 rakudo 版本(rakudo-0.2020.02-1.fc32.x86_64 所以可能是今年 2 月)。
我一直在 Cro 中使用模板(记录在https://cro.services/docs/reference/cro-webapp-template),并且很喜欢其中的子项。
我目前有一个“主”模板和一些报告,例如报告 1、报告 2 和报告 3。
假设我想从report3 中包含report1 的数组。
现在,假设每个报告都有以下子项:
init:一些 Javascript 初始化代码(无论使用多少个报告实例,都应该只包含一次)
HTML:报告的每个实例应包含一些 HTML 代码(带有一些参数来区分它,但由于 Javascript 框架的限制,可能不包含任何<script>或<style>标签
data:每次包含报告时都必须重复的 Javascript 片段
目前,我将上述每个内容都放在模板的单独子目录中。
Redeclaration of symbol '&__TEMPLATE_SUB__report-initial'.
虽然我可以将报告名称(例如“report1”)传递给主模板,但我缺少的是一种让主模板调用已传入的报告名称上的子程序的方法,因为可能有多个涉及报道。
理想的情况是,如果我能够以某种方式创建一个从模板继承的“报告”类,并将模板类的实例传递到主报告中,然后将子类作为报告类上的方法调用。但是,我一直无法找到一种方法来做到这一点。
我可以在这里看到三种可能的选择:
任何人可以提供的任何帮助将不胜感激。
谢谢!
编辑:我认为一个可以有多个(命名的)“主体”的宏可以解决这个问题。
我有一些可以在 Perl 中轻松完成的事情,但在 Raku 中却无法在不摆弄标志变量的情况下完成。这是 Perl 代码:
#!/usr/bin/perl
MAIN_BLOCK: {
foreach $item (1 2 3 4 5) {
$item == 6 and last MAIN_BLOCK;
}
print "No items matched!\n";
}
Run Code Online (Sandbox Code Playgroud)
这里的相关区别是 Perl 将允许您使用 last 退出任何标记块。仅当块是循环时,Raku 才会执行此操作。
有没有好的方法可以做到这一点?我觉得应该有一个移相器,但还没有弄清楚如何在没有标志变量的情况下做到这一点,这似乎是可以避免的。
谢谢,