Как выполнить лямбду в рамках "замыкания"?
Как это может работать?
use strict;
use warnings;
sub base {
my $constant = "abcd";
my ($driver_cr) = (@_);
&$driver_cr;
}
base(sub {print $constant});
Другими словами, как $driver_cr может иметь доступ к $constant без:
- передача константы $ в качестве аргумента водителю
&$driver_cr($constant)
- изменяя область действия константы $ на глобальную
our $constant = "abcd";
сделать общий блок и переместить постоянную $ из базы:
use strict; use warnings; { my $constant = "abcd"; sub base { my ($driver_cr) = (@_); &$driver_cr; } base(sub {print $constant}); }
1 ответ
Вот для чего нужны аргументы функций.
use strict;
use warnings;
sub base {
my $constant = "abcd";
my ($driver_cr) = (@_);
$driver_cr->($constant);
}
base(sub {
my $constant = shift;
print $constant;
});
Но если вы действительно против передачи аргументов, то:
use strict;
use warnings;
use Acme::Lexical::Thief;
sub base {
my $constant = "abcd";
my ($driver_cr) = (@_);
&$driver_cr;
}
base(sub {
steal $constant;
print $constant;
});