【发布时间】:2013-08-30 21:39:29
【问题描述】:
编辑:在下面添加了答案,此处留下的问题仅用于历史目的。
如果你愿意,你也可以显式指定方法名 用于读取和写入属性的值。这是 当您希望公开属性时特别方便 可读,但只能私人设置。例如:
has 'weight' => ( is => 'ro', writer => '_set_weight', );如果重量是基于其他方法计算的,这可能会很有用。 例如,每次调用eat方法时,我们可能会调整 重量。这让我们隐藏了权重的实现细节 变化,但仍向该类的用户提供权重值。
基于这个例子,我写了如下代码:
has '_current_url' => (
is => 'ro',
isa => 'URI',
writer => '_write_URI_to_current_url',
);
# Thus we ensure only a URI object gets written to current_url always
sub _current_url
{
my $self = shift;
$self->_write_URI_to_current_url(URI->new_abs($_[0], $self->start_url));
}
我的目的是确保设置 current_url 始终将其设置为 URI 对象,即使它是使用简单字符串调用的。但是,当我尝试运行代码时,我得到:
无法为 _current_url 的只读访问器赋值
在我尝试设置 current_url 的地方(在我的班级内)(使用$self->_current_url($str);)。
这是我与 Moose 的第二天,所以我对这里发生的事情感到很困惑。据我了解,is => 'ro' 只要求 Moose 不要创建与属性同名的默认写访问器,这种理解是否正确?我怎样才能在这里实现我的目标?
【问题讨论】:
-
对于您在这里所做的,您真正想要的是调查类型和类型强制。您不需要自定义编写器,您需要自定义强制。
-
@cjm Coercion 是我尝试的第一件事,但问题是类型更改的
via取决于 Moose 不喜欢的第二个参数$self->start_url,因此导致错误。via中的 sub 是否传递了 $self 的副本,是否可以对强制使用不同的属性?