Задержка кода объема изменяется в Perl

Я думаю, вы должны создать отдельные функции из валидации JS и использовать их. Например:

  //App.js

  hasSpecial(value) {
    const special = '!#$%&'()*+,-./:;<=>?@[\]^_{|}~"';
    return value.split("").some(char => special.includes(char));

    // or with regexp
    return /[!#$%&'()*+,-.\/:;<=>?@[\]^_{|}~"]/.test(value);
  }

  handleInputChange(value) {
    this.setState({
      value,
      conditions: {
        special: this.hasSpecial(value)
      }
    });
  }

  ...

    this.handleInputChange(e.target.value)}
     value={this.state.value}
   />

У меня есть несколько предложений по улучшению вашего кода и ваших навыков:

  • Используйте const вместо let или var. ссылка
  • Использовать методы Array (map, some, lower, forEach) вместо ссылки 'for'
  • Нельзя импортировать React Файл Validation.js
  • Использовать деструктуризацию объектов. Например: const { value, condition: { special } } = this.state; ссылка

5
задан brian d foy 22 March 2009 в 00:14
поделиться

5 ответов

Ну, Ваш конкретный случай уже обрабатывается при использовании лексических дескрипторов файлов (в противоположность старому стилю bareword дескрипторы файлов). Для других случаев Вы могли всегда использовать УНИЧТОЖАТЬ метод объекта, который, как гарантируют, пойдет для обнуления ссылок, когда он выходит из объема:

#!/usr/bin/perl

use strict;
use warnings;

for my $i (1 .. 5) {
    my $defer = Defer::Sub->new(sub { print "end\n" });
    print "start\n$i\n";
}

package Defer::Sub;

use Carp;

sub new {
    my $class = shift;
    croak "$class requires a function to call\n" unless @_;
    my $self  = {
        func => shift,
    };
    return bless $self, $class;
}

sub DESTROY { 
    my $self = shift;
    $self->{func}();
}

ETA: Мне нравятся имя brian лучше, Объем:: OnExit является намного более описательным именем.

4
ответ дан 18 December 2019 в 14:51
поделиться

Вместо того, чтобы использовать связь для этого, я думаю, что просто создал бы объект. Можно также избежать local это слишком.

{
my $defer = Scope::OnExit->new( @subs );
$defer->push( $other_sub ); # and pop, shift, etc

...
}

Когда переменная выходит из объема, у Вас есть шанс выполнить в вещах УНИЧТОЖАТЬ метод.

Кроме того, в примере Вы отправили, необходимо проверить, что значения, которые Вы храните, являются ссылками кода, и это - вероятно, хорошая идея проверить, что значение VAL является ссылкой на массив:

sub TIESCALAR { bless { VAL => [] }, $_[0] }

sub STORE {
    my( $self, $value )  = @_;

    carp "Can only store array references!" unless ref $value eq ref [];

    foreach { @$value } {
        carp "There should only be code refs in the array"
            unless ref $_ eq ref sub {}
        }

    foreach ( @{ $self->{VAL}} ) { $_->() }


    $self->{VAL} = $value;
    }
4
ответ дан 18 December 2019 в 14:51
поделиться

Можно хотеть испытать B:: Рычаги:: EndOfScope

Я Полагаю, что это работает:

   use B::Hooks::EndOfScope; 

   sub foo {
      on_scope_end { 
               $codehere;
      };
      $morecode
      return 1; # scope end code executes.
   }

   foo();
3
ответ дан 18 December 2019 в 14:51
поделиться

Тривиально,

sub OnLeavingScope::DESTROY { ${$_[0]}->() }

используемый как:

{
    ...
    my $onleavingscope = bless \sub { ... }, 'OnLeavingScope';
    my $onleavingscope2 = bless \\&whatever, 'OnLeavingScope';
    ...
}

(Дополнительный уровень наличия ссылки на ссылку на sub необходим только для работы вокруг оптимизации (это - возможно ошибка) при использовании незакрытия анонимная замена),

1
ответ дан 18 December 2019 в 14:51
поделиться

Я думаю, что Вы хотите что-то как Объем:: Охрана, но это не может быть продвинуто. Хм.

Спасибо.

1
ответ дан 18 December 2019 в 14:51
поделиться
Другие вопросы по тегам:

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