суббота, 5 декабря 2015 г.

"Постоянные" переменные, state и замыкания

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;

Комментариев нет:

Отправить комментарий