- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图坚持使用已发布的 API 来动态修改 Moo
中的方法, 并没有提出一个通用的解决方案。
首先,一些代码:
package R1 {
use Moo::Role;
sub r1 { say __PACKAGE__ }
}
package C1 {
use Moo;
sub c1 { say __PACKAGE__ }
}
use Scalar::Util qw[ blessed ];
use Moo::Role ();
my $c = C1->new;
Moo::Role->apply_roles_to_object( $c, 'R1' );
角色申请将说明一种方法的失败。
我尝试了两种方法。
第一个使用 Class::Method::Modifiers :
use Class::Method::Modifiers qw[ install_modifier ];
install_modifier( blessed( $c ),
before => r1 =>
sub { say "BEFORE r1" }
);
$c->r1;
并且工作正常:
% perl test.pl
BEFORE r1
R1
Moo
的内部代码 _install_modifier
子例程非常相似,但还执行额外的 Moo
特定操作,因此这种方法并不完全等同。
我尝试的下一个方法是直接使用 $c
可用的 before
修饰符,从而获得额外的 Moo
特殊调味汁:
$c->can('before')->( r1 => sub { say "BEFORE r1" } );
$c->r1;
但是……
% perl test.pl
The method 'r1' is not found in the inheritance hierarchy for class C1 at [...]/lib/site_perl/5.28.0/Class/Method/Modifiers.pm line 42.
Class::Method::Modifiers::install_modifier("C1", "before", "r1") called at /[...]/lib/site_perl/5.28.0/Moo/_Utils.pm line 44
Moo::_Utils::_install_modifier("C1", "before", "r1", CODE(0x5590bb800360)) called at [...]/lib/site_perl/5.28.0/Moo.pm line 84
Moo::before("r1", CODE(0x5590bb800360)) called at test.pl line 25
修饰符似乎是为原始 C1
类生成的,并且在应用 R1
角色时没有更新。以下令人震惊的骇客“修复”了:
use Import::Into;
Moo->import::into( blessed $c );
$c->can('before')->( r1 => sub { say "BEFORE r1" } );
$c->r1;
结果是:
% perl test.pl
BEFORE r1
R1
那么,有没有一种方法可以仅使用已发布的 Moo
API 来实现我的目标?
谢谢!
最佳答案
你可以通过应用另一个角色来修改方法(它甚至不必是 Moo::Role 除非你正在处理属性):
use Role::Tiny;
before r1 => sub { say "BEFORE r1" };
只需确保在组成 r1 方法的角色之后应用此角色,或在角色中包含一个虚拟 sub r1 {}
(如果已经存在,它将被忽略)。
关于perl - 使用已发布的 Moo API 动态修改 Moo 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54391782/
我正在尝试使用 GObject Introspection 在 Perl 中创建 Gtk3 应用程序和 Moo . Gtk 有一个非 Moo 类,Gtk::ApplicationWindow ,我通过
我将nearley.js 语法(和解析器)与moo.js 标记器一起使用。我的 Grammar.ne 文件如下: @{% const moo = require('moo') let
我试图坚持使用已发布的 API 来动态修改 Moo 中的方法, 并没有提出一个通用的解决方案。 首先,一些代码: package R1 { use Moo::Role; sub r1
我在我的应用程序中使用“Swanky and Moo Moo”,但它显示的字体样式与系统字体一样。 这是我的代码...... myLabel.font=[UIFont fontWithName:@"S
给出下面的代码,看起来你设置对象的顺序很重要。当我希望每个对象都有不同的列表时,下面的代码将为两个对象打印相同的列表,因为列表是在 BUILD 时创建的实例属性。 package t; use Moo
我有一个关于 Moo (https://github.com/geoffreywiseman/Moo/) 的问题,但我自己无法解决。我有这样的类结构: class Middle{ private
我使用 Moo 作为我的 OO 引擎,并且我想在运行时更改某些实例的行为。我需要添加新方法并更改现有方法。 Moo可以吗?如果没有,我怎样才能做到这一点? 最佳答案 您可以使用 Moo:Role 执行
我期望构建器方法能够访问调用者提供的所有其他属性。但它似乎只能访问那些名称按字母顺序小于当前属性的名称。例如。为什么b 的生成器在这里可以看到a 的值,但看不到c 的值? ('a' 和 'c' 都存在
我正在研究 Moo 并遇到了这个基本问题。如果我为只读属性设置访问器或编写器名称,则该属性变为可写。访问器或编写器是否暗示属性是可写的,即使它被设置为只读(is => 'ro')? 这是类代码: #!
我的基于 Moo 的类同时具有惰性和非惰性属性,它们同时具有 default 和 coerce 子项。如果我不初始化属性,我会发现 default 和 coerce 子都被调用为普通属性,但只有 de
我正在开发一个 MooX 模块,它需要在构造函数周围添加一个包装器。 我试过方法修改或让导入方法直接更改 *{"${target}::new"} 但没有效果。 那我该怎么做呢? 最佳答案 显然,aro
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 9 年前。 Improve
我想使用 Moo 作为我的应用程序(使用关系数据库)的面向对象方法。我用过DBIx::Class & Rose::DB::Object过去,但这些分布与 Moo(既不是 Moose)无关。我正在寻找带
在我的真实代码中,我想将 Moo(如果 Moo 不起作用,则为 Moose)对象与哈希(实际上是绑定(bind)哈希)“同步”,以便读取 Moo 对象的属性将从中读取相应的值哈希并写入 Moo 对象的
我正在寻找有关设置 JS lint 以使用 Debian Ubuntu 命令行中的 moo 工具的说明。 是否有针对此的软件包或说明,有人可以 $point 给我。如果有说明,我很乐意制作包裹! 最佳
我想使用 Moo 而不是 Moose,但我还需要从非 Moose 类继承。我应该如何处理?有没有一个模块可以解决这个问题?如果没有,有没有办法我自己处理? 最佳答案 Moo 已经可以处理子类化非 Mo
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我在这个网站上的第一个问题,我很快就来了。我是一名开发人员,我主要使用 Python 和 Perl。我充满激情,我真的很喜欢这种发展。 我的第一个问题是关于 Perl、Moo 和 Type::Tiny
使用 Moo::Role ,我发现循环导入默默地阻止了 before 的执行。我的方法的修饰符。 我有一个 Moo::Role在 MyRole.pm : package MyRole; use Moo
我发现了这个很棒的插件,名为 "The Wall"但遗憾的是,文档和 examples 都没有展示如何向其提供 JSON 对象。 假设我们有 JSON 数组,例如: [ { href : "/
我是一名优秀的程序员,十分优秀!