use strict;
use warnings;
use utf8;
use v5.14;
# Вариант 1.
# Постоянная лексическая переменная, объявленная
# с помощью state - недоступна для внешнего кода.
sub обновить { state $переменная += shift || 10 }
say обновить($_) for 0..4;
say '-' x 50;
# Вариант 2.
# В отличие от первого варианта здесь, как и должно быть,
# значение "my" переменной вычисляется без оглядки на её
# предыдущее состояние.
sub обновить_снова { my $переменная += shift || 10; }
say обновить_снова($_) for 0..4;
say '-' x 50;
# Вариант 3.
# Достигаем аналогичного результата, как в варианте 1,
# используя замыкание.
sub обновить_ещё_разок { my $переменная; sub { $переменная += shift || 10 } }
my $функция = обновить_ещё_разок;
say $функция->($_) for 0..4;
say '-' x 50;
# Вариант 4.
# Достигаем аналогичного результата, как в варианте 1,
# используя замыкание и постоянную лексическую переменную.
sub обновить_последний_раз { sub { state $переменная += shift || 10 } }
my $новая_функция = обновить_последний_раз;
say $новая_функция->($_) for 0..4;
суббота, 5 декабря 2015 г.
"Постоянные" переменные, state и замыкания
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий