【问题标题】:How do you create attribute handlers for methods of an object in Perl/Moose如何在 Perl/Moose 中为对象的方法创建属性处理程序
【发布时间】:2011-09-26 18:11:17
【问题描述】:

我想我已经为 perl Natives 准备好了属性处理程序!

package tree;
      has '_branches' => (
               traits    =>  ['Hash'], 
               is        => 'rw', 
               isa       => 'HashRef[Any]', 
               handles   => {
                  _set_branch  => 'set',
                  _is_branch   => 'defined',
                  _list_branches => 'keys',
                  _branch => 'get'
               },
               trigger   => sub {
                  my($self,$hash) = @_;
                  $self->_build_branch($hash);
               }

      );


sub _build_branch{
  my($self,$hash);
  # do stuff!
  #return altered or coerced hash
  return $hash;
}

你怎么看?

但假设我有一个带有以下方法的 LinkedList 对象

LinkedList{}
LinkedList.append()
LinkedList.insert()
LinkedList.size()
LinkedList.has_children()
LinkedList.remove()
LinkedList.split()

有没有办法通过 Moose Attributes 处理对象的方法(不使用 MooseX)——类似于这个?

package Bucket;
      has '_linkedlist' => (
               traits    =>  ['LinkedList'], 
               is        => 'rw', 
               isa       => 'LinkedListRef[Any]', 
               handles   => {
                  _add_link  => 'append',
                  _insert_link   => 'insert',
                  _count_links => 'size',
                  _del_link => 'remove',
                  _split_at_link => 'split',
                  _has_sublinks => 'has_children', 
               },

如果有办法做到这一点,那就太好了,但我担心我可能在某处误解了如何或为什么为非本地属性创建处理程序。

想法?

【问题讨论】:

  • 您是否有需要链表特征的原因(是否出于学习目的)?我之所以这么说是因为带有Array trait 的ArrayRef 类型可以处理你想要的一切(除了拆分)。在内部,perl 数组无论如何都是链表。但你的班级并不特别需要知道这一点。
  • 是的,这只是一个学习练习——我用 LinkedList 作为一个简单的例子来了解 Moose 属性发生了什么

标签: perl oop object moose handlers


【解决方案1】:

你只是把事情复杂化了,还是我遗漏了什么?

package Bucket;
has '_linkedlist' => (
   is        => 'rw', 
   isa       => 'LinkedList', 
   handles   => {
      _add_link      => 'append',
      _insert_link   => 'insert',
      _count_links   => 'size',
      _del_link      => 'remove',
      _split_at_link => 'split',
      _has_sublinks  => 'has_children', 
   },
);

哈希没有方法,这就是为什么它涉及到一个特征。该特征添加了方法。您的 LinkedList 类具有方法,因此无需编写 trait 来提供方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 2022-01-14
    • 2014-04-20
    • 2011-04-29
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多