7

我是 Moose 的新手,在使用 PDL 作为属性遇到障碍之前做得很好。我希望能够将对象写入文件(我一直在使用use MooseX::Storage; with Storage('io' => 'StorableFile');,并且该对象具有 aPDL作为属性。PDL::IO::Storable提供了以这种方式使用的必要方法Storable,但是我不知道如何在驼鹿。

这是一个例子,它有点长,我知道,但它是尽可能少的:

#!/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),但也许有人可以将我从中拯救出来(或者如果是的话,可以为我指明正确的道路)。

4

2 回答 2

7

你不说真正出了什么问题。猜测一下,您需要告诉MooseX::Storage如何使用 PDL 对象的 Storable 挂钩来处理 PDL 对象。MooseX::Storage 中此功能的文档非常差,但 MooseX::Storage::Engine 有一个add_custom_type_handler()方法,该方法采用类型名(在您的情况下为 PDL)和处理程序的 HashRef。

MooseX::Storage::Engine->add_custom_type_handler(
    'PDL' => (
        expand   => sub { my ($data) = @_;   ...  },
        collapse => sub { my ($object) = @_; ...  },
    )
);

#moose访问 irc.perl.org 或 Moose 邮件列表并询问。

[编辑:使用基于测试的示例进行更新。]

于 2011-05-23T20:49:28.627 回答
1

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; 
于 2015-06-23T14:25:51.217 回答