当前位置: 首页 > 知识库问答 >
问题:

如何在Raku实施

邵华皓
2023-03-14

在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。

around INSERT => sub {
    my $orig = shift;
    my $self = shift;

    print "Before the original sub\n";
    my $rv  = $orig->($self, @_);
    print "After the original sub\n";
};

如何在Raku中实现这种行为,最好使用角色?

共有3个答案

江鸿羲
2023-03-14

使用包装

sub bar () { return "baþ" };

my $wrapped = &bar.wrap( { " → " ~ callsame() ~ " ← " } );

say bar(); # OUTPUT:  «→ baþ ← »

由于方法是例程,您需要一种稍微复杂的方法来处理方法本身,但除此之外,方法是完全相同的,因为Methods是Routines的子类

class Baz {
    method bar () { return "baþ" };
}

my &method_bar = Baz.^find_method("bar");
my $wrapped = &method_bar.wrap( { " → " ~ callsame() ~ " ← " } );

say Baz.bar(); # OUTPUT:  «→ baþ ← »

美元包装是一个句柄,稍后可以在需要时使用它来展开它。

编辑:添加代码以获取类方法的句柄,例如,从这里获取。

郭永安
2023-03-14

方法::修饰符

实现before()、after()和around()函数,这些函数可用于修改类方法,类似于Perl 5的Moose。它在内部使用wrap(),并返回包装器处理程序,因此很容易。还原()原始。

这是模块围绕以下内容实现的方法

sub around ($class, $method-name, &closure) is export
{
  $class.^find_method($method-name).wrap(method { closure(); });
}
郎建章
2023-03-14

您可以使用角色对方法进行阴影处理,然后使用callwith:

class Foo {
    method meth { say 2 }
}

my $foo = Foo.new but role :: {
    method meth(|c) { say 1; callwith(|c); say 3 }
};

$foo.meth
 类似资料:
  • 我正在使用一个相当大的Cro应用程序,它有几十条路线、模型和其他逻辑。目前,每个路由块中都有一个来处理异常。这对维护不太友好,更不用说添加它们的工作了。所以,我想知道这是不是一个更好的方法。主路由块中的一个处理程序不起作用。异常仅在抛出它们的路由块中捕获。可能是线程问题。是否有一个地方可以实现一个异常处理程序,它可以获取所有异常并在不导致应用程序死亡的情况下处理它们?

  • 假设一个目录中有2个文件 在perl5中,我可以通过以下方式从p.pl加载模块Mod.pm: 我想知道的等价物是什么(如果文件是p.raku和Mod.rakumod)? 我想要完成的是相对于脚本加载模块。 我希望在启动脚本之前不设置env变量即可执行

  • 我定期关注GitHub Rakudo存储库,查看Rakudo编译器发生了哪些变化。 我有时会看到提交,其中单个函数的速度提高了一定的百分比,时间如下图所示。 评估这一点的工作流是什么?我很想了解这一点,以便了解您的功能是如何执行的,并相应地进一步优化,从而为Rakudo的发展做出贡献。 我在这里阅读帮助。我谷歌了一下,但找不到此信息。我还通过命令行选项了解了MoarVM分析器,它会生成输出。要寻找

  • 我发现,对于脚本编写成瘾者来说,加入raku的一个巨大卖点就是拥有这样的结构 然而,我似乎不能写这样的东西。据我所知,使用<代码>执行此操作。substStr的方法太难看了,这种链式的s///code>或者甚至也tr///code>基本上会成为sed用户等的门户药物。 我的问题是,我是否遗漏了什么,在拉库是否有可能发生类似的事情。我不是初学者,我想不出来。

  • 这主要是为了让你知道Raku有多棒。 我至少能想到几个。 更繁琐的脚踏实地的方法是将映射到惰性范围上。在repl中: 一个更酷的解决方案(我认为)是让你先把你的列表变成一张单子,然后对这个单子无限期地应用重复操作符: 这是对@Brad Gilbert的答案略作阐述。运算符在超运算符中包装字符串连接,这导致将包装后的二进制运算符应用于从两个列表中顺序选择的元素。 因此,为了实现我想要的(列表循环到一

  • Fedora 33 我正在尝试使用Raku从cupsGetDests2输出打印机列表。 这是C方式,尽管它也显示已删除的打印机: 我添加了“ Raku邮件列表上的一个朋友给我看了这段代码: 但它在输出时出错: libcups真的在那里! 我做错了什么? 新信息: 我做了以下操作: 现在运行该程序可提供: 这是我的打印机列表: 现在我做错了什么? 在Curt的帮助下解决了。我的新代码: 输出: