LINUX.ORG.RU

История изменений

Исправление DRVTiny, (текущая версия) :

Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их обязательно полностью описывать до того, как они будут использованы первый раз (см $dbg_ и $setErr):

my $LCO=sub { die 'You must use "new" constructor' };

sub new {
 my ($class,%Config)=@_;
 my %Err;

 my $dbg_=sub {
  print STDERR @_,"\n" if $Config{'debug'};
 };

 my $doSetErr=sub {
  my ($c,$m)=@_;
  $dbg_->('Error[',$c,']: ',$m);
  @Err{'code','msg'}=($c,$m);
 };

 my %methods=(

  'debug'=>sub :lvalue {
    my $v=lc(shift);
    return $Config{'debug'} unless @_;
    if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
     $Config{'debug'}=$v
    } else {
     $doSetErr->(127,'Wrong value for "debug" property')
    }
  },

 );

 $LCO=bless sub {
  my $method=shift;
  die 'No such method: '.$method unless $methods{$method};
  $methods{$method}->(@_);
 },$class


}

Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!

Исправление DRVTiny, :

Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их обязательно полностью описывать до того, как они будут использованы первый раз (см $dbg_ и $setErr):

my $LCO=sub { die 'You must use "new" constructor' };

sub new {
 my ($class,%Config)=@_;
 my %Err;

 my $dbg_=sub {
  print STDERR @_,"\n" if $Config{'debug'};
 };

 my $doSetErr=sub {
  my ($c,$m)=@_;
  $dbg_->('Error[',$c,']: ',$m);
  @Err{'code','msg'}=($c,$m);
 };

 my %methods=(

  'debug'=>sub :lvalue {
    my $v=lc(shift);
    return $Config{'debug'} unless @_;
    if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
     $Config{'debug'}=$v
    } else {
     $doSetErr->(127,'Wrong value for "debug" property')
    }
  },

 );

 $LCO=bless sub {
  my $method=shift;
  die 'No such method: '. unless $methods{$method};
  $methods{$method}->(@_);
 },$class


}

Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!

Исправление DRVTiny, :

Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их обязательно полностью описывать до того, как они будут использованы первый раз (см $dbg_ и $setErr):

my $LCO=sub { die 'You must use "new" constructor' };

sub new {
 my ($class,%Config)=@_;
 my %Err;

 my $dbg_=sub {
  print STDERR @_,"\n" if $Config{'debug'};
 }

 my $doSetErr=sub {
  my ($c,$m)=@_;
  $dbg_->('Error[',$c,']: ',$m);
  @Err{'code','msg'}=($c,$m);
 }

 my %methods=(

  'debug'=>sub :lvalue {
    my $v=lc(shift);
    return $Config{'debug'} unless @_;
    if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
     $Config{'debug'}=$v
    } else {
     $doSetErr->(127,'Wrong value for "debug" property')
    }
  },

 );

 $LCO=bless sub {
  my $method=shift;
  die 'No such method: '. unless $methods{$method};
  $methods{$method}->(@_);
 },$class


}

Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!

Исходная версия DRVTiny, :

Хотя... до меня только что дошло, какой ущерб есть от анонимных функций: нужно их декларировать «некрасивым образом», чтобы можно было использовать ранее, чем будет описано их «тело»:

my $LCO=sub { die 'You must use "new" constructor' };

sub new {
 my ($class,%Config)=@_;
 my %Err;

 my $dbg_=sub {
  print STDERR @_,"\n" if $Config{'debug'};
 }

 my $doSetErr=sub {
  my ($c,$m)=@_;
  $dbg_->('Error[',$c,']: ',$m);
  @Err{'code','msg'}=($c,$m);
 }

 my %methods=(

  'debug'=>sub :lvalue {
    my $v=lc(shift);
    return $Config{'debug'} unless @_;
    if ($v=~m/^(?:[01]|true|false|yes|no)$/) {
     $Config{'debug'}=$v
    } else {
     $doSetErr->(127,'Wrong value for "debug" property')
    }
  },

 );

 $LCO=bless sub {
  my $method=shift;
  die 'No such method: '. unless $methods{$method};
  $methods{$method}->(@_);
 },$class


}

Здесь я не могу описать dbg_ и setErr где-нибудь в конце new, даже если объявлю эти переменные раньше!