por*_*ton 3 perl attributes types moo
我们使用 Perl Moo。
定义一组属性:
package C;
use Moo;
use Types::Standard qw(Str Int Num Maybe);
has 'x' => (is=>'rw', isa=>Str);
has 'y' => (is=>'rw', isa=>Int);
has 'z' => (is=>'rw', isa=>Int);
# here to insert make_optional() described below
1;
Run Code Online (Sandbox Code Playgroud)
我想编写一个例程,将某些属性的 T 替换为 Maybe[T]。例如:make_optional(qw(x y))
应该使 type ofx
Maybe[Str]
和 type of y
Maybe[Int]
。
用Moo怎么做?
你不能。
Moo 没有元对象协议。没有它,你就不能回去改变东西。
没有元对象。如果您需要这种级别的复杂性,则需要 Moose - Moo 很小,因为它明确不提供元协议。
此外,类型只是代码引用。
没有内置的类型系统。isa 使用 coderef 进行验证;如果您需要复杂类型,Type::Tiny 可以提供类型、类型库,并且可以与 Moo 和 Moose 无缝协作。
您可以做的是编写一种类型来访问其他地方的某种单例,以决定它的行为是否像Maybe[Str]
或Str
,但这是一个远景,可能又丑又疯狂,您不应该这样做。