Как я лучше всего делаю инициированные средства доступа со значениями по умолчанию у Американского лося?

bulk insert tablename from 'C:\test.csv' with (rowterminator = '\n',fieldterminator = ',',KEEPIDENTITY)
7
задан FMc 11 October 2009 в 14:55
поделиться

2 ответа

Недавно я столкнулся с этим, и после того, как я спросил на канале #moose , мне сказали чтобы справиться с этим следующим образом:

Отметьте cache_allowed_values ​​ как lazy_build , сделайте _build_cache_allowed_values ​​ ссылку на текущие разрешенные_значения записи] и -trigger on allowed_values ​​, который очищает cache_allowed_values ​​.

Таким образом, независимо от того, в каком порядке значения запрашиваются или сохраняются, они всегда будут правильными с наименьшим объемом работы .


Пример:

has cache_allowed_values => (is => 'ro', lazy_build => 1);
sub _build_cache_allowed_values {
  return { map { $_ => 1 } @{shift->allowed_values} };
}
has allowed_values => (
  is => 'rw',
  trigger => sub { shift->clear_cache_allowed_values },
  default => ...,
);
7
ответ дан 7 December 2019 в 03:18
поделиться

Я думаю, вы действительно хотите, чтобы allowed_values ​​ была отдельной структурой данных с желаемыми свойствами эффективности и упорядочения. Поскольку не похоже, что вы заботитесь об упорядочивании, почему бы и нет:

has 'allowed_values' => (
    traits  => ['Hash'],
    isa     => HashRef[Bool],
    default => sub { +{} },
    handles => {
        _add_allowed_value   => 'set',
        remove_allowed_value => 'delete',
        value_is_allowed     => 'exists',
        allowed_values       => 'keys',
    },
);

method add_allowed_value(Str $value){
    $self->_add_allowed_value( $value, 1 );
}

В общем, все, что не относится к реализуемому классу, вероятно, должно быть реализовано в другом месте. Ускорение поиска в массивах - это не задача того класса, который вы пишете, поэтому его следует реализовать в другом месте, и этот класс должен использовать этот класс. (В простом случае, как в случае с хешем выше, возможно, можно игнорировать это правило. Но если бы это было более сложным, вы бы определенно захотели исключить его.)

Изменить:

Если вы хотите, чтобы пользователь Чтобы подумать, что это список, как насчет:

use MooseX::Types::Moose qw(Bool ArrayRef HashRef);
use MooseX::Types -declare => ['ListHash'];
subtype ListHash, as HashRef[Bool];

coerce ListHash, from ArrayRef, via { +{ map { $_ => 1 } @$_ } };

has 'allowed_values' => (
    # <same as above>
    isa    => ListHash,
    writer => 'set_allowed_values',
    coerce => 1,
);

Теперь вы можете установить allowed_values ​​ как:

my $instance = Class->new( allowed_values => [qw/foo bar/] );
$instance->set_allowed_values([qw/foo bar baz/]);

И получить к ним доступ, например:

2
ответ дан 7 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

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