【问题标题】:Perl Moose Hash traitsPerl Moose 哈希特征
【发布时间】:2012-02-17 02:15:08
【问题描述】:

我在 Moose 中有一个参数对象,它具有文件通配符到 glob 的属性

所以我有办法做到这一点

sub getInputFileParams{
    my ($self) = @_;

    #the only parameters passed in are in fact the input files
    return keys(%{$self->{extraParams}});
}

但是我为什么不将属性迭代为哈希?

has 'extraParams' => (
    is        => 'ro',
    isa       => 'JobParameters::Base',
    default   => sub { {} },
    traits    => ['Hash'],
    handles   => {
       keys_extraParams => 'keys',
    },

);

但是,这令人窒息,因为它不是哈希引用。我是否遗漏了某些内容或将对象用作哈希错误

【问题讨论】:

  • 不要忘记点击大勾号接受答案!

标签: perl hash moose traits


【解决方案1】:

是的,使用对象作为普通哈希是不好的。

您正在直接访问它们的内部状态,这会绕过它们可能存在的任何接口,并使您的类与 JobParameters::Base 类的内部表示紧密耦合。

如果您需要能够以哈希的形式获取 JobParameters::Base 对象的内容,则将 to_hash 方法添加到 JobParameters::Base,并在属性中委托给该方法...

这意味着如果稍后您将缓存(例如!)添加到 JobParameters::Base,并使用 __cache 键来存储内部数据,您可以通过更改 to_hash 方法来安全地进行此更改以从它返回的哈希值。

将一个属性存储为一个散列是可以的,但如果你要存储一个祝福散列,那么不要触及它的胆量..

【讨论】:

  • 我认为这是前进的方向。我正在尝试编写更少的神秘 perl,这是我的 getInputFileParams sub
  • 更具体地说,针对您的问题,在 JobParameters::Base 中编写一个方法,该方法返回您想要的参数流,以便您可以直接迭代该流。
【解决方案2】:

你已经在你的 Moose 类定义中设置了所有工具,你只是没有使用它们 - 试试这个:

return $self->keys_extraParams

【讨论】:

  • $self->extraParams->keys 需要使用 Moose::Autobox,这并不总是一个好的选择。
  • 其实keys是他从traits => [Hash]得到的一个方法(Moose::Meta::Attribute::Native::Trait::Hash)。不需要自动框。
  • @RickF:不,本机属性特征仍然不允许您将哈希视为可以调用方法的对象。它在原始对象上定义方法,而不是散列,因此您可以使用$self->keys(尽管您应该将该方法命名为更好的名称,例如 extraParamKeys。)
  • 啊,我现在明白我的错误了。我删除了错误的位 - 原始代码中的 handles ... 行给出了一个正常运行的 keys_extraParams
  • 这仍然不能满足原始发布者的要求,因为原始代码中的句柄已损坏(除非他在 JobParameters::Base 中编写了 keys() 方法)。
猜你喜欢
  • 2014-09-03
  • 2021-01-22
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2013-08-10
相关资源
最近更新 更多