【发布时间】:2015-07-15 15:42:53
【问题描述】:
我想在每次设置时修改属性的值,无论它是在构造函数中完成还是由“编写器”完成(在这种情况下我不使用“构建器”或“默认”)。基本上属性(不需要'Str'类型)被传递给构造函数,在某些情况下我想在此之后修改它的值,但在每种情况下我都想对它做一些正则表达式(例如)。
我的第一种方法是使用 BUILDARGS 和 around 方法,两者都将使用相同的正则表达式函数,但后来我想知道强制。唯一的问题是我不知道如何创建一个无论如何都会强制强制的子类型/类型定义。
例如:
package Foo;
use Moose::Util::TypeConstraints;
subtype 'Foo::bar' => as 'Str';
coerce 'Foo::bar'
=> from 'Str'
=> via {
$_ =~ s/some_stuff//g;
$_ =~ s/other_stuff//g;
$_ =~ s/some_other_stuff//g;
};
has 'bar' => (isa => 'Foo:bar', coerce => 1);
我不想用'where'子句定义子类型/类型
subtype 'Foo::bar' => as 'Str' => where {$_ !~ /some_stuff/ && $_ !~ /other_stuff/ && ... };
因为这对我来说似乎很乏味。
编辑:我正在寻找一个全面的解决方案,我不仅可以使用“Str”类型属性,还可以使用“ArrayRef”、“HashRef”等。
【问题讨论】:
-
你是说强制并不总是发生吗?什么情况下不强制取值?
-
@ikegami Foo->new( bar => 'Some string' ) 不会发生强制,因为传递的值已经是一个字符串。 “强制让你告诉 Moose 自动将一种类型转换为另一种”,输入和输出类型都是字符串。我不坚持使用这种方法,只是寻找最佳选择。
-
所以你是说强制永远不会发生?请说明你的问题是什么!!!至少提供一个演示!
-
你说得对,我不够清楚。强制有效,但它不会进入“via”块,因为传递的值和子类型都是字符串,并且子类型定义中没有“where”子句可以强制强制进入“via”块。