我是Moose的新手,做得很好,直到我在使用PDL作为属性时遇到了问题。我希望能够将对象写入文件(我一直在使用use MooseX::Storage; with Storage('io' => 'StorableFile');,这个对象有一个PDL作为属性。PDL::IO::Storable提供了以这种方式使用Storable的必要方法,但是我不知道如何在Moose中做到这一点。
这是一个例子,我知道这有点长,但我尽量做到最小:
#!/usr/bin/perl
package LinearPDL;
use Moose;
use PDL::Lite;
use PDL::IO::Storable;
use MooseX::Storage;
with Storage('io' => 'StorableFile');
has 'length' => (is => 'ro', isa => 'Num', required => 1);
has 'divisions' => (is => 'ro', isa => 'Int', required => 1);
has 'linear_pdl' => (is => 'ro', isa => 'PDL', lazy => 1, builder => '_build_pdl');
sub _build_pdl {
my $self = shift;
my $pdl = $self->length() / ( $self->divisions() - 1 ) * PDL::Basic::xvals($self->divisions());
return $pdl;
}
no Moose;
__PACKAGE__->meta->make_immutable;
use strict;
use warnings;
my $linear_pdl = LinearPDL->new('length' => 5, 'divisions' => 10);
print $linear_pdl->linear_pdl;
$linear_pdl->store('file'); # blows up here!
my $loaded_lpdl = load('file');
print $loaded_lpdl->linear_pdl;我想我可能必须创建一个PDL类型,或者甚至将PDL包装成某种东西(使用MooseX::NonMoose::InsideOut),但也许有人可以将我从这些事情中解救出来(如果是的话,也可以给我指出正确的方向)。
发布于 2011-05-24 04:49:29
你不会说出真正的问题所在。根据猜测,您需要告诉MooseX::Storage如何使用PDL对象的可存储钩子来处理该PDL对象。对于这个特性,MooseX::Storage中的文档非常差,但是MooseX::Storage::Engine有一个接受typename (在本例中是PDL)的add_custom_type_handler()方法和一个处理程序的HashRef。
MooseX::Storage::Engine->add_custom_type_handler(
'PDL' => (
expand => sub { my ($data) = @_; ... },
collapse => sub { my ($object) = @_; ... },
)
);请在irc.perl.org或Moose邮件列表上通过#moose并询问。
[编辑:使用基于tests的示例进行更新。]
发布于 2015-06-23 22:25:51
Joel的问题和perigrin的回应帮助我解决了一个存储问题,这个问题已经在我的脑海中存在了一段时间。我在这里发布了一个工作示例。它不使用PDL,但它是相关的,可能会在未来对某些人有所帮助。
{
package MVR;
use Moose;
use MooseX::Storage;
use Math::Vector::Real;
use Data::Structure::Util qw (unbless);
with Storage('format' => 'JSON', 'io' => 'File');
MooseX::Storage::Engine->add_custom_type_handler(
'Math::Vector::Real' => (
expand => sub {my $v = shift; Math::Vector::Real->new(@{$v})},
collapse => sub {my $mvr = shift; return (unbless($mvr)) },
)
);
has 'mvr' => (is => 'rw', isa => 'Math::Vector::Real');
1;
}
use Math::Vector::Real;
my $p = MVR->new(mvr => V(0,1,3));
print $p->dump;
$p->store('my_point.json');
my $p1 = MVR->load('my_point.json');
print $p1->dump; https://stackoverflow.com/questions/6101800
复制相似问题