【发布时间】:2016-09-16 13:13:12
【问题描述】:
我们使用 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;
我想编写一个例程,将某些属性的 T 替换为 Maybe[T]。例如:make_optional(qw(x y)) 的类型应该是 x Maybe[Str] 和 y Maybe[Int] 的类型。
Moo 怎么做?
【问题讨论】:
-
和你的很多问题一样,我问自己:为什么?
-
@simbabque 我们有一些(轻量级且功能不丰富)ORM(高于 DBI + SQL 的级别)。现在我被任命为“业务对象”(高于 ORM 的级别)。业务对象的某些类型(和
has语句)是从数据库列信息自动生成的。但我需要手动指定可以采用undef值(与 NULL 列不同)(Maybe类型)的列列表,并以简单的方式完成。 -
您不能编写代码生成器并在表格布局发生变化时像使用 DBIC 一样运行它吗?
-
@simbabque 我们已经有了这样的代码生成器。问题是 NULL 列和属性之间没有一对一的对应关系,这些属性可以采用
undef值。是的,这很愚蠢;但这是我们的现实 -
然后在该代码生成器中保留错误列的列表,并在生成的代码中修复它们。或者,如果最糟糕的情况发生了,请拥有一个空的数据库结构副本,以及一个使所有错误列都可以为空的 sql 脚本,然后在该数据库上运行您的代码生成器。但尝试在实际生成的代码中修复它,而不是在代码运行后运行的东西中修复它。
标签: perl types attributes moo