【问题标题】:Moose: subtype message does not show upMoose:子类型消息不显示
【发布时间】:2016-11-12 00:38:33
【问题描述】:

我开始使用 Moose。这是我的测试包代码:

package MyTest;
use Moose;
use Moose::Util::TypeConstraints;

subtype 'MyStatus',
      as 'Int',
      where { $_ >= 0 && $_ < 10 },
      message { "Wrong status: $_" };

has status => ( is => 'rw', isa => 'Maybe[MyStatus]' );

no Moose; 1;

这是程序:

use strict;
use warnings;
use MyTest;

my $t1 = MyTest->new('status' => 3);
$t1->status(100);

我预计会收到“错误状态:100”错误,但结果却是:

属性(状态)未通过类型约束,因为:在访问器 MyTest::s 状态(在 MyTest.pm 第 10 行定义)第 4 行,“Maybe[MyStatus]”的验证失败,值为 100 em>

如何使该消息起作用? 谢谢!

【问题讨论】:

  • 请不要重新输入错误信息。而是复制并粘贴它们。您的斜体引文中有拼写错误。 ;-)
  • 我复制粘贴了
  • 那么它可能是输出中的换行符,因为您的终端窗口对于文本来说太小了。没关系。 ;)
  • 您是否将其复制并粘贴在两个部分中? “MyTest::s status”中有一个空格:-)
  • 那是 cmd 窗口中的线闸(在 Windows 上)。

标签: perl moose subtype


【解决方案1】:

Maybe[] 吃掉了错误信息。如果您删除它,它会从您的类型中提供message

has status => ( is => 'rw', isa => "MyStatus" );

这是错误:

属性(状态)没有通过类型约束,因为:错误状态:100 在访问者 MyTest::status(定义在 /home/foo/code/scratch.pl 第 1331 行)第 4 行 MyTest::status('MyTest=HASH(0x3434c58)', 100) 在 /home/foo/code/scratch.pl 第 1337 行调用

这是因为Maybe[] 本身也只是一个函数调用。它使用您传递给构造函数的值(这里是100)检查调用MyStatus 后面的代码引用的返回值。如果该类型检查通过,则一切正常。但如果检查失败,Maybe[] 会发出自己的错误消息。

您应该问自己这个问题:您真的希望status 可以是undefrequired 不是你写的,所以你可以省略它。那么您的对象就没有状态,这与具有 undefined 状态不同。状态意味着对象处于某种状态,其中状态具有意义。如果该状态未定义,那对我来说听起来很麻烦。

【讨论】:

  • 我找不到定义Maybe 的实际代码。我一定是在寻找错误的东西。
  • 谢谢!有什么办法可以覆盖这种行为?我需要它来接受 undef 或小范围的 int 值。
  • 嗯...也许有。 (双关语!)查看v1.metacpan.org/pod/…
  • 如果有时间我可能会做一些研究。
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2023-03-03
相关资源
最近更新 更多