Moose:如何获取对象数组?特质?

2024-03-14

我开始意识到这适合初学者:

package Bad;

has 'arr' => ( is => 'rw', 'ArrayRef[Str]' );

package main;

my $bad = Bad->new(arr => [ "foo", "bar" ]);
print $bad->arr->[0], "\n";

输入特征。不过,我对 Traits API 并不感兴趣。我是否误解了什么?我可以以某种方式获得这个 API 吗? :

print $bad->arr->get(0), "\n";

Details

查看规范特征示例驼鹿::元::属性::本机::特征::数组 http://search.cpan.org/dist/Moose/lib/Moose/Meta/Attribute/Native/Trait/Array.pm

package Stuff;
use Moose;

has 'options' => (
    traits  => ['Array'],
    is      => 'ro',
    isa     => 'ArrayRef[Str]',
    default => sub { [] },
    handles => {
        all_options    => 'elements',
        add_option     => 'push',
        map_options    => 'map',
        filter_options => 'grep',
        find_option    => 'first',
        get_option     => 'get',
        join_options   => 'join',
        count_options  => 'count',
        has_options    => 'count',
        has_no_options => 'is_empty',
        sorted_options => 'sort',
    },
);

no Moose;
1;

使用这样声明的对象,例如:

my $option = $stuff->get_option(1);

我真的不喜欢我获得的一个数组属性,并且必须在我的 Stuff 类中手动命名 11 个方法 - 一个方法用于对“选项”执行的每一项操作。不一致的命名必然会发生,而且很臃肿。

我如何(优雅地)获得如下 API:

my $option = $stuff->options->get(1);

所有方法都来自哪里驼鹿::元::属性::本机::特征::数组 http://search.cpan.org/dist/Moose/lib/Moose/Meta/Attribute/Native/Trait/Array.pm以类型安全的方式实现?

然后每个数组上的所有操作都以完全相同的方式命名......

(我实际上使用的是 Mouse,但 Mouse 的大部分与 Moose 相同)


我认为将 API 转换为该格式的最佳方法是为选项创建一个新对象,并将方法直接委托给它。就像是:

package Stuff;
use Moose;
use Stuff::Options;

has 'options' => (
    'is'      => "ro",
    'isa'     => "Stuff::Options",
    'default' => sub { Stuff::Options->new },
);

no Moose;
1;

然后在Stuff/Options.pm:

package Stuff::Options;
use Moose;

has '_options' => (
    'is'      => "ro",
    'isa'     => "ArrayRef[Str]",
    'traits'  => [ "Array" ],
    'default' => sub { [] },
    'handles' => [ qw(elements push map grep first get join count is_empty sort) ],
);

no Moose;
1;

这将允许您的示例中的代码正常工作($stuff->options->get(1)).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Moose:如何获取对象数组?特质? 的相关文章

随机推荐

  • 新的 PendingIntent 更新当前意图

    我试图在一段时间间隔后显示不同的通知 但发生的情况是它更新了当前的通知PendingIntent结果 即使我触发 4 5 个待处理的意图请求 我也只能收到一个通知 单击按钮后我会执行以下操作 try adapter OpenDB int i
  • 反复出现的成本难题

    我经常发现自己必须定义一个函数的两个版本 以便拥有一个 const 版本和一个非常量版本 通常是 getter 但并非总是如此 两者的区别仅在于 其中一个的输入和输出是常量 而另一个的输入和输出是非常量 该功能的核心 真正的工作 是相同的
  • 跨线程共享具有特征对象的结构作为属性

    我有下面的代码 有了注释掉的部分 它就可以工作了 当我取消注释这些部分时 它不再编译 如何调整注释部分以使它们工作 即我想让线程同时访问表达式树 当我尝试时 编译器会开始出现有关线程安全的错误 我阅读了 Rust 书籍并了解 C C 但还不
  • 如何在scrapy中获取原始start_url(重定向之前)

    我正在使用 Scrapy 来抓取一些页面 我从 Excel 工作表中获取 start urls 并且需要将 url 保存在项目中 class abc Spider BaseSpider name abc allowed domains ab
  • 如果用户登录,Angular 6 会更改组件

    使用基于 JWT 的实现和 Angular 6 根据用户是否登录隐藏 显示组件的最佳方法是什么 如果有一个包含用户相关信息的 Observable 用户对象就好了 这个需要守卫吗 后端使用 NET Core 2 1 不确定这是否有什么区别
  • 使用实体框架将自定义字符串作为主键

    我正在尝试使用 Code First 实体框架将个性化字符串设置为主键 我有一个助手 它的函数返回一个 n 个字符的随机字符串 我想用它来定义我的 Id 就像 YouTube 视频代码一样 using System Security Cry
  • 调用失败,参数为空

    我有以下代码 public static ContactEventValue GetContactEventValue ContactEventType contactEventType string programCode string
  • CMake:管理源文件列表

    我目前遇到的问题是 我只是希望通过抓取所有内容并删除一些我不需要的零碎内容来管理我的源文件列表 我希望 Cmake 为此提供很好的内置工具 所以我可能会从以下开始 file GLOB A Application cpp 我觉得我想创建另一个
  • 当 SASS 重新编译 CSS 时,Chrome 的“自动重新加载生成的 CSS”不会重新加载页面

    当我保存监视的 SCSS 文件时 我试图让 Chrome 的 DevTools 自动重新加载页面 该文件将编译并对 CSS 文件进行更改 I have the Auto reload generated CSS option checked
  • 将 List[Tuple2[A,B]] 转换为 Tuple2[Seq[A],Seq[B]]

    卡在这里 尝试将案例类元组列表转换为序列元组并对结果进行多重分配 val items repo foo list gives me a List A B 我可以像这样完成多项任务 val a b items map 1 toSeq item
  • Shopify API 订单查询参数的时区

    The Shopify 订单 API http api shopify com order html允许指定基于日期的查询参数 例如created at min 我想知道这些日期预计在哪个时区 如果您不提供时区 Shopify 将采用 UT
  • 使用 QOffscreenSurface 进行离屏渲染 - QPainter Alpha 笔颜色失败

    我努力了这个方法 https stackoverflow com questions 31323749 easiest way for offscreen rendering with qopenglwidget 的回答尼基塔 费多尼特 h
  • 哦,我的 zsh 显示出奇怪的字符“?”在终端上

    我已经安装了 iTerm2 和 Oh my zsh 然而 自从我将 ZSH THEME 更改为 agnoster 后 出现了一个奇怪的问号 附上相同的屏幕截图 我认为电力线会有所帮助 但似乎并没有发生 谁能帮我解决这个问题吗 这已经解决了这
  • 如何在 Laravel 5.6 的默认注册表单中添加自定义字段?

    在我的一个拉拉维尔 5 6应用程序中 我需要在默认注册表单中添加更多字段 所以我只在默认注册表单中添加了一个字段来测试 phone no 注册 blade php 并且还添加phone no 注册控制器 但是当我单击注册按钮时 它显示以下错
  • 执行 Mariadb 更新语句时出错

    我正在使用以下更新语句来更新数据库表中的行 update department set budget budget 0 01 where dept name Physics 但是 运行此代码会出现以下错误 ERROR 1305 42000
  • 将 n 位的 std_logic_vector 向右或向左移位

    我有一个向量signal tmp std logic vector 15 downto 0 我必须将它向左或向右移动 n 位 我怎样才能实现这个操作 我想到了串联操作 但我不知道如何使用它 Use the ieee numeric std库
  • 使用 D3 获取实时数据

    我想知道是否可以使用 D3 库来处理我的服务器通过 websockets 发送的实时数据 我看不到任何证明这一点的文档或示例 我最初的期望是通过以下代码示例来做到这一点 ws new WebSocket ws localhost 8888
  • “属性应该是哈希值,但实际上是字符串”

    我在 Rails 3 应用程序中保存哈希时遇到问题 使用控制台时我可以保存它 只是当我通过表单提交哈希时它不起作用 这个问题解决了 https stackoverflow com questions 10345054 how to edit
  • 从数据库检索数据并将其显示在 php 的表中..看看这段代码有什么问题吗? [复制]

    这个问题在这里已经有答案了 db mysql connect localhost root er mysql select db ram query insert into names values name add1 add2 mail
  • Moose:如何获取对象数组?特质?

    我开始意识到这适合初学者 package Bad has arr gt is gt rw ArrayRef Str package main my bad Bad gt new arr gt foo bar print bad gt arr