gpt4 book ai didi

perl - 使用 MooseX::Declare 创建 BUILDARGS 方法的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:35:43 24 4
gpt4 key购买 nike

我在调用 BUILDARGS 时无法正确使用 MooseX::Declare。

我正在尝试创建一个对象作为文件的接口(interface)。 (具体来说,我想要一个二进制文件的接口(interface),让我可以查看文件中接下来的几个字节,然后将它们切掉以进行进一步处理。)

我希望能够像这样创建这些对象之一

my $f = binary_file_buffer->new( $file_name );

然后像这样使用它
while( my $block_id = $f->peek( $id_offset, $id_length ) ) {
$block_id = unpack_block_id( $block_id );
$munge_block{ $block_id }->(
$f->pop( $block_size[ $block_id ] )
);
}

我的 binary_file_buffer 类定义/声明看起来像这样
use MooseX::Declare;
class binary_file_buffer {
use FileHandle;
use Carp;

has _file => ( is => 'ro', isa => 'FileHandle' );
has _file_name => ( is => 'ro', isa => 'Str' );
has _buff => ( is => 'rw', isa => 'Str', default => '' );

method BUILDARGS ( Str $file_name ) {
my $file = FileHandle->new( $file_name );
carp "unable to open $file_name : $!" unless defined $file;
$file->binmode;
return (
_file_name => $file_name,
_file => $file,
);
}

# get the next n bytes from the buffer.
method pop ( Int $len ) {
# ... Make sure there is data in _buff
return substr( $self->{_buff}, 0, $len, '' );
}

# Look around inside the buffer without changing the location for pop
method peek ( Int $offset, Int $len ) {
# ... Make sure there is data in _buff
return substr( $self->{_buff}, $offset, $len );
}
}

(这里没有包含缓冲区加载和管理代码。这很简单。)

问题是,我使用关键字 methodBUILDARGS宣言。因此,MooseX::Declare 期望 binary_file_buffer对象作为 BUILDARGS 的第一个参数.但是 BUILDARGS获取传递给 new 的参数,因此第一个参数是字符串 a 'binary_file_buffer' ,包的名称。结果,它无法通过类型检查并在使用 new 创建对象时死掉,就像我在第一个代码片段中所做的那样。 (至少这是我对正在发生的事情的理解。)

我得到的错误信息是:
Validation failed for 'MooseX::Types::Structured::Tuple[MooseX::Types::Structured::Tuple[Object,Str,Bool],MooseX::Types::Structured::Dict[]]' failed with value [ [ "binary_file_buffer", "drap_iono_t1.log", 0 ], {  } ], Internal Validation Error is: Validation failed for 'MooseX::Types::Structured::Tuple[Object,Str,Bool]' failed with value [ "binary_file_buffer", "drap_iono_t1.log", 0 ] at C:/bin/perl/site/lib/MooseX/Method/Signatures/Meta/Method.pm line 445
MooseX::Method::Signatures::Meta::Method::validate('MooseX::Method::Signatures::Meta::Method=HASH(0x2a623b4)', 'ARRAY(0x2a62764)') called at C:/bin/perl/site/lib/MooseX/Method/Signatures/Meta/Method.pm line 145
binary_file_buffer::BUILDARGS('binary_file_buffer', 'drap_iono_t1.log') called at generated method (unknown origin) line 5
binary_file_buffer::new('binary_file_buffer', 'drap_iono_t1.log') called at logshred.pl line 13

我喜欢类型检查糖 method $file_name 的关键字提供,但我不知道如何获取它,因为 BUILDARGS在技​​术上不是一种方法。

MooseX::Declare 是否有办法跳过 $self创造,还是类似的东西?

我这样做是正确的 MooseX::Declare 方式吗?还是我错过了什么?

最佳答案

我想你想要像 method BUILDARGS (ClassName $class: Str $filename) { ... } 这样的东西在其中您将调用者明确定义为 ClassName $class .

关于perl - 使用 MooseX::Declare 创建 BUILDARGS 方法的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1370911/

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