LINUX.ORG.RU

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

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

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

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

То есть я могу сделать вот так:

package My::Class;
my $lastCreatedObj;
sub new {
 my ($class,%Config)=@_;
 my %Props;
 unless ($lastCreatedObject) {
  foreach my $method ('debug') {
   *$method=sub :lvalue {
     my $self=ref($_[0]) eq 'My::Class'?shift:$lastCreatedObject;
     die 'You MUST create class instance (object) to use class methods!' unless $self;     
     $self->(@_)
   }
  }
 } 
 $lastCreatedObject=bless sub :lvalue {
  my $methodName=shift;
  my %methods=(
   'debug'=>sub :lvalue {
     $Config{'debug'}=shift if @_;
     return $Config{'debug'}
   },
   'default'=>sub :lvalue {
     my ($propName,$propVal)=@_;
     $Props{$propName}=$propVal if defined($propVal);
     return $Props{$propName};
   },
  )
  if ($methods{$methodName}) {
   $methods{$methodName}->(@_)
  } else {
   $methods{'default'}->($methodName,@_)
  }
 },$class;
}
Меня такой подход устраивает полностью за исключением того факта, что я теперь могу внутри своей clojure использовать только функции в стиле и духе функционального программирования: они будут обязаны принимать все необходимые параметры на вход и не могут использовать «глобальные» по отношению к ним переменные типа того же хэша %Config!

Вот от этого я и расстраиваюсь сильно :)

P.S. Извините за код без подсветки, пойду читать справочник по LORCODE'у

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

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

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

То есть я могу сделать вот так:

package My::Class;
my $lastCreatedObj;
sub new {
 my ($class,%Config)=@_;
 my %Props;
 unless ($lastCreatedObject) {
  foreach my $method ('debug') {
   *$method=sub :lvalue {
     my $self=ref($_[0]) eq 'My::Class'?shift:$lastCreatedObject;
     die 'You MUST create class instance (object) to use class methods!' unless $self;     
     $self->(@_)
   }
  }
 } 
 $lastCreatedObject=bless sub :lvalue {
  my $methodName=shift;
  my %methods=(
   'debug'=>sub :lvalue {
     $Config{'debug'}=shift if @_;
     return $Config{'debug'}
   },
   'default'=>sub :lvalue {
     my ($propName,$propVal)=@_;
     $Props{$propName}=$propVal if defined($propVal);
     return $Props{$propName};
   },
  )
  if ($methods{$methodName}) {
   $methods{$methodName}->(@_)
  } else {
   $methods{'default'}->($methodName,@_)
  }
 },$class;
}
Меня такой подход устраивает полностью за исключением того факта, что я теперь могу внутри своей clojure использовать только функции в стиле и духе функционального программирования: они будут обязаны принимать все необходимые параметры на вход и не могут использовать «глобальные» по отношению к ним переменные типа того же хэша %Config! Вот от того я и расстраиваюсь сильно :)