Как выполнить лямбду в рамках "замыкания"?

Как это может работать?

    use strict;
    use warnings;

    sub base {
      my $constant = "abcd";
      my ($driver_cr) = (@_);
      &$driver_cr;
    }

    base(sub {print $constant});

Другими словами, как $driver_cr может иметь доступ к $constant без:

  1. передача константы $ в качестве аргумента водителю &$driver_cr($constant)
  2. изменяя область действия константы $ на глобальную our $constant = "abcd";
  3. сделать общий блок и переместить постоянную $ из базы:

    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;
});
Другие вопросы по тегам