从 ArrayRef[HashRef] 强制 ArrayRef[MyClass]

2024-02-14

在试图回答的过程中如何从大哈希实例化 Moose 类 https://stackoverflow.com/q/12483775/468327,我想我又遇到了一个我不完全理解 Moose 类型强制的地方。由于某种原因,以下代码发出警告:

You cannot coerce an attribute (departments) unless its type (ArrayRef[Company::Department]) has a coercion at ./test.pl line 12.
You cannot coerce an attribute (employees) unless its type (ArrayRef[Company::Person]) has a coercion at ./test.pl line 23.

但随后成功了。

#!/usr/bin/env perl

use warnings;
use strict;

package Company;
use Moose;
use Moose::Util::TypeConstraints;

has 'id'   => (is => 'ro', isa => 'Num');
has 'name' => (is => 'ro', isa => 'Str');
has 'departments' => (is => 'ro', isa => 'ArrayRef[Company::Department]', coerce => 1);

coerce 'ArrayRef[Company::Department]',
  from 'ArrayRef[HashRef]',
  via { [ map { Company::Department->new($_) } @$_ ] };

package Company::Department;
use Moose;

has 'id'   => (is => 'ro', isa => 'Num');
has 'name' => (is => 'ro', isa => 'Str');
has 'employees' => (is => 'ro', isa => 'ArrayRef[Company::Person]', coerce => 1);

package Company::Person;
use Moose;
use Moose::Util::TypeConstraints;

has 'id'         => (is => 'ro', isa => 'Num');
has 'name'  => (is => 'ro', isa => 'Str');
has 'age'        => (is => 'ro', isa => 'Num');

coerce 'ArrayRef[Company::Person]',
  from 'ArrayRef[HashRef]',
  via { [ map { Company::Person->new($_) } @$_ ] };

package main;

my %hash = (
    company => {
        id => 1,
        name => 'CorpInc',
        departments => [
            {
                id => 1,
                name => 'Sales',
                employees => [
                    {
                        id => 1,
                        name => 'John Smith',
                        age => '30',
                    },
                ],
            },
            {
                id => 2,
                name => 'IT',
                employees => [
                    {
                        id => 2,
                        name => 'Lucy Jones',
                        age => '28',
                    },
                    {
                        id => 3,
                        name => 'Miguel Cerveza',
                        age => '25',
                    },
                ],
            },
        ],
    }
);

my $company = Company->new($hash{company});
use Data::Dumper;
print Dumper $company;

这应该如何完成?附:我尝试简单地做

coerce 'Company::Department',
  from 'HashRef',
  via { Company::Department->new($_) };

但它死得很惨。


好吧,它并没有完全成功,当您尝试使用以下命令更新这些字段时,您应该能感觉到coerce => 1。那是why http://search.cpan.org/~drolsky/Moose-1.10/lib/Moose/Manual/Delta.pod:

除非属性的类型约束具有,否则不能传递 coerce => 1 胁迫

以前,这个被接受了,而且有点效果, 除非您尝试在对象被设置后设置该属性 创建后,您将收到运行时错误。 现在,当您尝试定义该属性时,您将收到错误消息。

尽管如此,我认为我找到了解决这个问题的方法,首先引入子类型,然后更改包的顺序:

package Company::Person;
use Moose;
use Moose::Util::TypeConstraints;

subtype 'ArrayRefCompanyPersons',
  as 'ArrayRef[Company::Person]';

coerce 'ArrayRefCompanyPersons',
  from 'ArrayRef[HashRef]',
  via { [ map { Company::Person->new($_) } @$_ ] };

has 'id'         => (is => 'ro', isa => 'Num');
has 'name'  => (is => 'ro', isa => 'Str');
has 'age'        => (is => 'ro', isa => 'Num');

package Company::Department;
use Moose;

has 'id'   => (is => 'ro', isa => 'Num');
has 'name' => (is => 'ro', isa => 'Str');
has 'employees' => (is => 'ro', isa => 'ArrayRefCompanyPersons', coerce => 1);

package Company;
use Moose;
use Moose::Util::TypeConstraints;

subtype 'ArrayRefCompanyDepartments',
  as 'ArrayRef[Company::Department]';

coerce 'ArrayRefCompanyDepartments',
  from 'ArrayRef[HashRef]',
  via { [ map { Company::Department->new($_) } @$_ ] };

has 'id'   => (is => 'ro', isa => 'Num');
has 'name' => (is => 'ro', isa => 'Str');
has 'departments' => (is => 'ro', isa => 'ArrayRefCompanyDepartments', coerce => 1);

其余代码与您的版本中的相同。这可以在没有任何警告的情况下工作,并且more-o-less的行为就像(我再次认为)它应该的那样。

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

从 ArrayRef[HashRef] 强制 ArrayRef[MyClass] 的相关文章

  • Perl - HTTP::代理捕获 XHR/JSON 通信

    网站http openbook etoro com main http openbook etoro com main 有一个实时提要 由 javascript 通过 XHR keep alive 请求生成 并以 gzip 压缩 JSON
  • 我的 Perl 脚本中的 findnodes 语句有什么问题?

    我有一个简单的 xml 文件 如下所示
  • 调用 Perl 子程序时使用 & 符号和括号

    usr bin perl sub t print in t n print n s sub s print in s n print n t 1 2 print out n print n Output in t 1 2 in s 1 2
  • 如何使用 Perl 从 NCBI 获取 FASTA 核苷酸格式的基因特征?

    我可以手动下载 FASTA 文件 如下所示 gt lcl CR543861 1 gene 1 ATGCTTTGGACA gt lcl CR543861 1 gene 2 GTGCGACTAAAA 通过单击 发送到 并选择 基因特征 FAST
  • CPAN shell 内存不足。在 Unix 上如何给它更多的内存?

    我得到一个Out of memory 所有安装的消息 我以前从未使用过 cpan 并且不太确定它是如何工作的 我做了一个ulimit在 cpan 目录中 结果是无限的 这是我正在看的内容 usr bin perl MCPAN e shell
  • 使用 Perl 分割大文本文件

    我必须将一个 1 8Tb 的大文本文件分成两部分 我只需要文件的后半部分 该文件有 n作为记录分隔符 I tried perl ne print if gt line to start from test txt gt result txt
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • Perl 导入到我的所有包中?

    我倾向于经常使用 Data Dumper 最终我的 pl 代码中每个包的顶部都有以下样板 use strict use warnings use Data Dumper Data Dumper Deparse 1 Data Dumper P
  • 如何构建 Perl Web 服务基础设施

    我有许多用于管理多服务器基础设施的脚本 其中一些脚本需要 root 访问权限 一些需要访问数据库 并且大多数脚本都是基于 perl 的 我想将所有这些脚本转换为非常简单的 Web 服务 可以从不同的应用程序执行 这些 Web 服务将接受常规
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • 如何编写 Perl 脚本来使用 curl 处理 URL?

    我有一个非常简单的任务 我有一个 crontab 每小时运行一个脚本 该脚本旨在简单地处理 URL 这就是我所拥有的 这不起作用 我收到语法错误 usr bin perl curl http domain com page html 我已经
  • 如何将 Perl 转换为 C?

    有没有可用的工具可以将 Perl 源代码转换为 C 源代码 什么平台都可以 对此的规范答案是MJD 的 为什么不将 Perl 翻译成 C http www perl com pub a 2001 06 27 ctoperl html
  • 在 Ubuntu 中执行 .cgi 文件

    我在 Ubuntu 下运行 Apache PHP 当我运行 cgi 文件时 通过http localhost mycgi cgi 浏览器将显示代码而不是运行它 如何让浏览器执行 CGI 文件而不是显示其内容 将这些行添加到您的 apache
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • Perl 正则表达式图灵完备吗?

    我见过 Ruby 和 Perl 程序员做了一些事情复杂的代码挑战 https codegolf stackexchange com questions 3596 regex validating regex完全用正则表达式 这前瞻和后瞻 h
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • 快速 Perl signint 处理程序

    收到 Ctrl C 时处理程序清理的最方便 最清晰的方法是什么 例如 当我的套接字服务器以这种方式被终止时 TCP 套接字永远不会关闭 我想要一个很好的衬里 我可以将其放在程序的顶部来设置 sigint 处理程序 或类似 atexit 的东
  • Perl 和 Selenium::远程::驱动程序

    再次编辑 我在弗吉尼亚州北部某处的 AWS 上有一台服务器 这是我的监控服务器 我从另一个状态 ssh 进入这个 Ubuntu 服务器来进行系统管理 我想在这台服务器上进行 Web 自动化测试 它将测试互联网上的 Web 应用程序 点击 U
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl

随机推荐

  • “抄送”c++ istream?

    对于我自己的小解析器框架 我试图定义 类似 以下函数 template
  • AES 实施速度

    我已经编写了 AES 的 C 实现 并尝试使其尽可能快 我刚刚开始编程并接受 IT 培训 到目前为止 我已经实现了约 600 的速度提升 但仍然非常慢 为了将我的 AES 实现与我在 Linux 终端中使用的 openssl speed 命
  • 如何在 Material UI 中布局表单?

    我正在尝试使用 MaterialUI Grid 组件和字段构建以下表单布局 Form Field 1 Field 2 TextArea
  • 从 Angular JS 表单发布数据时出错

    我有一个 angularJS 表单 它将数据发布到 scalatra servlet 提交表单后 我无法在 scalatra servlet 中获取任何表单参数 下面是我的代码 AngularJS scope createUser func
  • 使用 JavaScript 隐藏网格项

    我有一个 2 x 2 CSS 网格 每个网格项都简要描述了一项服务 小型企业网站 每个网格项都有一个按钮来了解有关所述服务的更多信息 当用户单击四个按钮之一以了解更多信息时 我希望该网格项展开以占据整个 2x2 网格 我已经在工作 并且其他
  • 尝试从联合中提取类型时出现类型错误

    我正在尝试将类型定义添加到一些使用通过网络工作人员传递消息的代码中 调度的消息有一个字符串类型的成员 可以在运行时使用它来区分它们 One type of Message export interface IOpenFileWMsg typ
  • 选择随机种子并保存

    我想选择一个随机种子numpy random并将其保存到变量中 我可以使用设置种子numpy random seed seed None 但是你如何让 numpy 选择一个随机种子并告诉你它是什么 号码好像用过 dev urandom默认情
  • Hibernate setMaxResult 对父集合也限制子集合

    我有一个带有 ManyToMany fetch FetchType EAGER 子集合的父实体 我只需要加载我找到的父实体的第一条记录 因此我使用以下标准加载它 session createCriteria Parent class set
  • 套件构建过程中出现异常如何解决?

    我已按照以下步骤测试我的应用程序 我已经创建了 Android 项目 我已经为我的示例应用程序和测试应用程序创建了调试签名 需要测试 将sampleapp debug apk放在bin文件夹中 我的工作区在那里 在模拟器中安装了 testa
  • 如何禁用ant design日期选择器中的所有星期日和特定日期数组

    以下代码禁用了包括今天在内的所有先前日期 但我想禁用 ant design 日期选择器中的所有星期日和特定日期数组 lt DatePicker size large format DD MM YYYY nChange this onDate
  • 如何在 Eloquent ORM Laravel 中删除“updated_at”同时保留“created_at”

    在 Laravel 中 我有一个仅创建但未更新的模型 所以 我只想删除updated at场地 但是created at字段为必填项 那么我怎样才能只删除updated at场 同时保持created at field 在您的模型中添加以下
  • 使用自动映射器映射异步结果

    我们正在创建 angularjs 应用程序的 Web Api 应用程序 Web Api 返回 json 结果 第一步是获取数据 public List
  • WSL,使用“wsl --exec ”或“wsl -- ”运行 linux 命令

    wsl h显示以下内容 exec e
  • “创建新的 Android 虚拟设备 (AVD)”对话框中的“确定”按钮不执行任何操作

    尝试通过以下步骤从 eclipse 环境创建 AVD 单击 Windows Android 虚拟设备管理器 这将打开 Android 虚拟设备管理器 对话框 在对话框中 单击 新建 这将打开 创建新的 Android 虚拟设备 AVD 对话
  • 反应未定义

    我刚刚开始玩反应宝石 https github com reactjs react rails但我似乎遇到了问题 使用下面的代码 每当我路由到 React 示例页面时 我注意到浏览器开发人员控制台中会显示 React 未定义 它指的是这一行
  • 终止信号示例

    我正在尝试这个例子 http www cs cf ac uk Dave C node24 html http www cs cf ac uk Dave C node24 html include
  • 检测目标 CPU 上的对齐内存要求

    我目前正在尝试构建一个可以在多种机器上运行的代码 从手持口袋和传感器到数据中心的大型服务器 这些架构之间的 许多 差异之一是对齐内存访问的要求 标准 x86 CPU 不需要对齐内存访问 但许多其他 CPU 需要它 如果不遵守规则 就会产生异
  • 如何清理未使用的Azure资源

    我的任务是清理 Azure 订阅中未使用的资源 总共有600多种资源 我更喜欢通过脚本 power shell 来执行此操作 因为我必须在多个订阅中重复此活动 首先也许我可以 gt 获取上次更新 活动时间 查看列表 gt 删除资源 有人已经
  • 为什么任何长度的密钥都适用于 RijndaelManaged?

    关于方法 RijndaelManaged CreateDecryptor Method Byte Byte Here https msdn microsoft com en us library 2f5ff61x v vs 110 aspx
  • 从 ArrayRef[HashRef] 强制 ArrayRef[MyClass]

    在试图回答的过程中如何从大哈希实例化 Moose 类 https stackoverflow com q 12483775 468327 我想我又遇到了一个我不完全理解 Moose 类型强制的地方 由于某种原因 以下代码发出警告 You c