加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:59:58 所属栏目:大数据 来源:网络整理
导读:在调用BUILDARGS时,我很难正确使用MooseX :: Declare. 我正在尝试创建一个对象作为文件的接口. (具体来说,我想要一个二进制文件的接口,让我可以查看文件中的下几个字节,然后将它们关闭以进行进一步处理.) 我希望能够像这样创建其中一个对象 my $f = binary_f
在调用BUILDARGS时,我很难正确使用MooseX :: Declare.

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

我希望能够像这样创建其中一个对象

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},$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 );
    }
}

(缓冲区加载和管理代码我没有在这里包含.它非常直接.)

问题是,我在BUILDARGS声明中使用关键字方法.因此,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,Bool]' failed with value [ "binary_file_buffer",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

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

MooseX :: Declare有没有办法跳过$self创建,或类似的东西?

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

解决方法

我想你想要像方法BUILDARGS(ClassName $class:Str $filename){…},你可以在其中明确地将调用者定义为ClassName $class.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读