Inheritance 如何通过扩展模块正在使用的类来扩展模块?
一些背景:我想扩展,以允许更轻松地解析列表。这类似于Perl 5中的Inheritance 如何通过扩展模块正在使用的类来扩展模块?,inheritance,grammar,raku,Inheritance,Grammar,Raku,一些背景:我想扩展,以允许更轻松地解析列表。这类似于Perl 5中的relaxed标志。具体来说,我想在列表的末尾加一个逗号。例如,{a:1,“b:2,}。注意2后面的逗号,这是正常JSON语法规范(或JSON::Tiny)不允许的 通过检查,这似乎可以像扩展一个模块一样简单,JSON::Tiny正在内部使用,然后覆盖其中的两个规则: grammar JSON::Relaxed::Grammar is JSON::Tiny::Grammar { rule pairlist { <
relaxed
标志。具体来说,我想在列表的末尾加一个逗号。例如,{a:1,“b:2,}
。注意2
后面的逗号,这是正常JSON语法规范(或JSON::Tiny
)不允许的
通过检查,这似乎可以像扩展一个模块一样简单,JSON::Tiny
正在内部使用,然后覆盖其中的两个规则:
grammar JSON::Relaxed::Grammar is JSON::Tiny::Grammar {
rule pairlist { <pair> * %% \, } # override this rule
rule arraylist { <value> * %% [ \, ] } #overide this rule
}
在上面的评论中,实现a)和b)的最佳方法是什么?你可以像这样分别输入语法和动作:
use JSON::Tiny::Grammar;
use JSON::Tiny::Actions;
然后像问题中那样推导出你自己的语法
使用生成的语法和现有的Actions类,您将得到
JSON::Relaxed::Grammar.parse($input, :actions(JSON::Tiny::Actions)).ast
请注意,在META6.json中,它确切地告诉您可以使用什么
由于要将原始的从json::Tiny
导出到json
,因此必须将一个导出到json
并转发到原始。下面是实现此目的的代码:
sub to-json(|c) is export {
use JSON::Tiny;
to-json(|c);
}
这将使
JSON::Tiny
中的符号仅在to JSON
函数的词法范围内可用,该函数只需获取其所有参数并使用它们调用原始的to JSON
函数。有趣的想法!但这是否意味着我必须将JSON::Tiny
模块中的所有代码复制到我的JSON::released
模块中?我也希望避免这一部分。@HåkonHægland不。您可以像使用任何其他类一样使用它们。如果需要,您必须重写语法和操作的规则(类方法),但仅此而已。除此之外,它们是类。@HåkonHægland JSON::Tiny::Grammar是一个类和一个语法。如果它是公共的,您可以使用并覆盖上面提到的方法。关键是,如果您想更改语法,使用它,从它继承,然后像对待任何其他类一样重写这些方法。您不需要复制所有方法。@HåkonHægland最好的方法是将JSON::Tiny的部分声明为角色,而不是整个类。但按照现在的方式,我将创建一个派生自JSON::Tiny的clase,其中包括派生自JSON::Tiny::grammar的新语法。我需要深入研究一下代码,看看这是否可行,但无论如何我都会尝试这样做。请检查我的编辑,我添加了代码,以便从json::Tiny
sub to-json(|c) is export {
use JSON::Tiny;
to-json(|c);
}