gpt4 book ai didi

Perl/Moose 不会创建对象,但如果属性错误也不会死亡

转载 作者:行者123 更新时间:2023-12-02 04:32:25 25 4
gpt4 key购买 nike

有下一个包

package MyTest;
use warnings;
use Moose;
use Types::Path::Tiny qw(AbsPath AbsFile);

has 'file' => (
is => 'ro',
isa => AbsPath,
required => 1,
coerce => 1,
);
no Moose;
__PACKAGE__->meta->make_immutable;
1;

工作(几乎)正常,所以使用时

use strict;
use warnings;
use feature 'say';
use Mytest;
use DDP;

my $t1 = MyTest->new(file => './t'); # the ./t is existing file in the filesystem
say $t1 ? "ok" : "no";

my $t2 = MyTest->new(file => './nonexistent_file');
say $t2 ? "ok" : "no";
p $t2;

对两者都表示“确定”。 $t2->fileisa "Path::Tiny

但是,如果文件系统中不存在该文件,我不想创建该对象。因此,第二个 ($t2) 调用应返回 undef

更改

        isa => AbsPath,

        isa => AbsFile,

将检查文件是否存在,但如果不存在 - 脚本将终止

Attribute (file) does not pass the type constraint because:  File '/tmp/nonexistent_file' does not exist

我不想死,只想不创建 MyTest 实例并在文件不存在或不是普通文件时返回 undef。如果该文件存在,则该文件应该是一个 Path::Tiny 实例。 (从 Str 强制)。

有人可以帮助我吗?

最佳答案

最简单的方法是捕获并丢弃预期的错误:

use Try::Tiny;

my $instance = try {
MyTest->new(file => './nonexistent_file');
} catch {
# only mute the constraint errors
return undef if /\AAttribute [(]\w+[)] does not pass the type constraint/;
die $_; # rethrow other errors
};

修改构造函数以使其在失败时返回 undef 并不是一个好主意,因为有一个隐含的约定,即 ->new 将始终返回有效的实例。在旧的 Perl 代码中,在失败时返回一个特殊值被认为是可以的,但这会强制对调用者进行额外的检查 - 并且检查可能会被忘记。 Moose 通过使用异常来代替(从而强制处理它们),尽管在这种特定情况下这确实添加了一些样板文件,但它采取了更强大的路线。

如果您想隐藏此样板文件,请考虑编写工厂方法。

关于Perl/Moose 不会创建对象,但如果属性错误也不会死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22757091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com