【问题标题】:Overriding a class' "is" attribute (Moose)覆盖类的“is”属性(Moose)
【发布时间】:2023-03-31 01:10:02
【问题描述】:

我正在尝试子类化 ro 属性以使其成为 rw,如下所示:

has '+content' => (is => 'rw');

这似乎不起作用。这不可能吗?

【问题讨论】:

  • 可能是has '+content' => (accessor=>'content');?但是,与其改变$o->content 的行为,不如添加一个writer 来代替?
  • 我尝试添加作家。不过,也许我不知道它是如何工作的。因为我得到了同样的Cannot assign a value to a read-only accessor 错误。
  • 如果它有效,它将是has '+content' => (writer=>'set_content'); 然后是$o->set_content($new_value)
  • 啊,现在明白了。谢谢。
  • 两者都不是特别好的解决方案。您应该更新基类以支持您需要它支持的内容。

标签: perl moose


【解决方案1】:

您应该将对象定义为只读,然后提供私有写入器

#!/usr/bin/perl
use Modern::Perl;

{
    package Foo;
    use Moose;

    has bar => (
      is     => 'ro',
      writer => '_set_bar',
  );

}

my $foo = Foo->new;

如果你尝试$foo->bar('something');,你会得到你在评论Cannot assign a value to a read-only accessor中提到的错误,这就是你需要的魔法$foo->_set_bar('something');
由于继承,它将在 Moose 框架中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2014-01-08
    • 2013-04-05
    • 1970-01-01
    • 2020-04-02
    • 2016-07-20
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多