在 Perl/Tk 中,可以为小部件定义文本变量。它是对某个保存该值的标量的引用。
有人向我展示了如何使用 Moose 属性强制来将 Moose 属性用作文本变量(酷!)。它是这样工作的:
subtype 'TkRef' => as 'ScalarRef';
coerce 'TkRef', from 'Str', via { my $r = $_; return \$r };
has 'some_val' => (is => 'rw', isa => 'TkRef', coerce => 1, default => 'default value');
$mw->Entry(-textvariable => $self->some_val);
$mw->Label(-textvariable => $self->some_val); # will always Show what we type into the entry
但是,当我想为该属性设置新值时,我必须像这样取消引用它:
${$self->some_val} = 'blarg'; # dereference
简单地设置属性是行不通的,因为引用需要在对象的生命周期内保持不变(即属性值本身不能更改)。
有没有一种方法可以使用漂亮的 Moose 属性强制功能,而又不会失去设置属性的可能性$self->some_val('blarg');
?某种反向强制?
将访问器设为私有,然后为访问器提供包装器。像这样的事情:
subtype 'TkRef', as 'ScalarRef';
coerce 'TkRef', from 'Str', via { my $r = $_; return \$r };
has _some_val => (
is => 'rw',
isa => 'TkRef',
coerce => 1,
init_arg => 'some_val',
default => 'default value',
);
sub some_val {
my $self = shift;
if (@_ and not ref $_[0]) {
${$self->_some_val} = shift;
}
elsif (@_ and ref $_[0]) {
${$self->_some_val} = ${+shift};
}
$self->_some_val(@_);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)