У Американского лося, как я изменяю атрибут какое-либо время, он установлен?

Вы могли использовать обратная функция с соответствующими параметрами для получения текущего URL.

19
задан FMc 12 September 2009 в 17:29
поделиться

4 ответа

Я не уверен, какая модификация вам нужна, но вы можете добиться того, что вам нужно, используя приведение типов:

package Foo;
use Moose;

use Moose::Util::TypeConstraints;

subtype 'ModStr' 
    => as 'Str'
    => where { /^modified: /};

coerce 'ModStr'
    => from 'Str'
    => via { "modified: $_" };

has 'bar' => ( 
    isa => 'ModStr', 
    is  => 'rw', 
    coerce => 1,
);

Если вы воспользуетесь этим подходом, не все значения будут быть модифицированным. Все, что проходит проверку как ModStr, будет использоваться напрямую:

my $f = Foo->new();
$f->bar('modified: bar');  # Set without modification

Эта слабость может быть в порядке или может сделать этот подход непригодным для использования. В правильных обстоятельствах это может быть даже преимуществом.

8
ответ дан 30 November 2019 в 04:20
поделиться

Вы можете использовать модификатор метода 'around'. Примерно так:

has 'bar' => (
    isa    => 'Str',
    reader => 'get_bar',
    writer => 'set_bar'
);

around 'set_bar' => sub {
    my ($next, $self, $bar) = @_;
    $self->$next( "Modified: $bar" );
};

И да, работа напрямую с хеш-значениями считается плохой практикой.

Также, пожалуйста, не думайте, что представленный мной вариант обязательно правильный. Использование подтипов и принуждения будет правильным решением в большинстве случаев - если вы подумаете о своем параметре с точки зрения типа, который может быть повторно использован во всем приложении, это приведет к гораздо лучшему дизайну, чем произвольные модификации, которые могут быть сделано с использованием «вокруг». См. Ответ @daotoad.

10
ответ дан 30 November 2019 в 04:20
поделиться

Я думаю, используя хэш ссылка подходит для триггера следующим образом:

package Foo;
use Moose;

has 'bar' => ( 
    isa => 'Str', 
    is  => 'rw', 
    trigger => sub { $_[0]->{bar} = "modified: $_[1]" },
);

Триггер также срабатывает, когда bar arg передается с конструктором. Этого не произойдет, если вы определите свой собственный метод set_bar или с помощью модификатора метода.

re: hash reference - Обычно я считаю, что лучше всего придерживаться методов установки / получения атрибутов, если (как в случае с триггером выше) нет простого альтернатива.

6
ответ дан 30 November 2019 в 04:20
поделиться

Если работа с хешем напрямую вызывает у вас беспокойство, вы можете указать альтернативного писателя, а затем использовать его из своего собственного «общедоступного» писателя с соответствующим именем.

package Foo;
use Moose;

has 'bar' => (
   isa => 'Str',
   reader => 'get_bar',
   writer => '_set_bar',
);

sub set_bar {
   my $self = shift;
   my @args = @_;
   # play with args;
   return $self->_set_bar(@args);
}

Это или триггеры, может показаться мне хорошим подходом в зависимости от того, когда и как вам нужно манипулировать аргументами.

(отказ от ответственности: непроверенный код, написанный из памяти, просмотр SO на нетбуке с нестабильным доступом к краям)

3
ответ дан 30 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: