2014-04-30 3 views
2

Perl/Tk에서는 위젯 용 텍스트 변수를 정의 할 수 있습니다. 값을 보유하는 스칼라에 대한 참조입니다. 누군가 무스 속성을 사용하여 무스 속성을 textvariable (cool!)로 사용하는 방법을 보여주었습니다.큰 사슴 속성 인 Perl/Tk 위젯 textvariable을 업데이트하는 방법은 무엇입니까?

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 

단순히 속성을 설정하면 작동하지 않습니다 이것은 어떻게 작동 참조가 객체의 수명 동안 동일하게 유지되어야하므로 (즉, 속성 값 자체는 변경할 수 없습니다.)

$self->some_val('blarg');으로 속성을 설정할 가능성을 잃지 않고 멋진 무스 속성 강제 변환 기능을 사용할 수 있습니까? 어떤 종류의 역방향 강제?

답변

1

접근자를 비공개로 만든 다음 접근 자에 대한 래퍼를 제공하십시오. 이 같은 것 :

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(@_); 
} 
+0

이것은 매우 멋지다. 형식 강요는 다른 프로그래밍 언어의 형체가 많은 것을 생각 나게하지만 필자는 Perl을 결국 선택했기 때문에 이것이 내가 원하는 것을 정확하게 수행합니다. 이제 남은 것은 캡슐화하여 모든 변수를 볼 때마다 볼 필요가 없기 때문입니다. – capfan