Nano Hash - криптовалюты, майнинг, программирование

Изменить методы атрибута Moose

Я создаю список атрибутов (более трех, показанных ниже), все из которых используют общие методы. Можно ли затем добавить триггер к одному из методов:

# Create a bunch of attributes
for my $attr ( qw( title name address ) ) {
    has $attr => ( is => 'rw', isa => 'Str' );

    around $attr => sub {
        # more stuff here.
    }
}

# Add a trigger
has_another_method 'title' => ( trigger => \&_trigger_title );

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

Обновлять

Ответы ясно дали понять, что изменение атрибута после его создания не является хорошей идеей. Вместо этого я выбрал другой метод, который позволяет хранить все параметры атрибутов в одном месте. Этот пример немного упрощен, но он демонстрирует идею:

# Create a bunch of attributes
for my $attr ( qw( title name address ) ) {

    my %options = ( is => 'rw', isa => 'Str' );

    # Add a trigger to the title attribute.
    $options{ 'trigger' } = \&_trigger_title
        if $attr eq 'title';

    has $attr => ( %options );

    around $attr => sub {
        # more stuff here.
    }
}
02.12.2010

Ответы:


1

Триггеры — это просто атрибут атрибута, но они предназначены только для чтения. Вы могли бы find_meta( $attribute )->get_attribute('trigger')->set_value( $attribute, sub { new trigger }), но здесь вы действительно нарушаете инкапсуляцию.

Я бы просто объявил все общие атрибуты в моем цикле for, а затем объявил бы особые случаи в другом месте.

02.12.2010
  • Я думал, что изменение атрибута может быть плохой идеей. Я выбрал немного другое решение, которое позволило мне сохранить параметры атрибутов по умолчанию, определенные в одном месте. 02.12.2010

  • 2

    Методы атрибутов составляются при их создании, поэтому, как правило, рекомендуется иметь все доступные параметры при его создании с помощью директивы has. Однако в настоящее время с методами триггера ничего особенного не делается, поэтому вы можете сделать это, чтобы обойти параметр "триггер", доступный только для чтения:

    my $attr = __PACKAGE__->meta->get_attribute('title')->meta->get_attribute('trigger')->set_raw_value('_trigger_sub_name');
    

    Однако это слишком глубокое погружение во внутренности Лося; если реализация когда-либо изменится, вы можете быть SOL (плюс вы будете нарушать ограничения, которые существуют по какой-то причине). Поэтому было бы намного настроить триггеры следующим образом:

    has $_ => (
        is => 'rw', isa => 'Str',
        trigger => '_trigger_' . $_,
    ) for (qw(title name address));
    
    sub _trigger_title {
        # implementation here
    }
    sub _trigger_name {
        # implementation here
    }
    sub _trigger_address {
        # implementation here
    }
    
    02.12.2010
  • Мне нужно добавить триггер только для нескольких атрибутов из длинного списка, так что, к сожалению, это не совсем подходит. Однако это подтвердило мое подозрение, что изменение атрибута после его создания — плохая идея. 02.12.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..