Inheritance 如何通过扩展模块正在使用的类来扩展模块?

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 { <

一些背景:我想扩展,以允许更轻松地解析列表。这类似于Perl 5中的
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);
}