Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замыкание и изменение лексической переменной, после определения замыкания 
V
    Опции темы
MaXL
Дата 20.8.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Всем привет. Изучаю Perl, дошёл до замыканий и кое-чего не понял. Думаю кто-нибудь поможет прояснить ситуацию.
Написал небольшой скрипт, использующий замыкания:
Код

use warnings;
use strict;

sub genFunc
{
  my $k = shift;
  my $newF = sub
  {
    my $x = shift;
    return $k * $x;
  };
  return $newF;
}

$a = genFunc(10);
$b = genFunc(20);

print $a->(11), "\n";
print $b->(11);

он, как и ожидалось выводит
110
220
После чего, исправил функцию genFunc следующим образом:
Код

use warnings;
use strict;

sub genFunc
{
  my $k = shift;
  my $newF = sub
  {
    my $x = shift;
    return $k * $x;
  };
  $k = 10;
  return $newF;
}

$a = genFunc(10);
$b = genFunc(20);

print $a->(11), "\n";
print $b->(11);

и получил неожиданный, для себя результат:
110
110
Не могу никак понять, из-за чего появляется такой эффект. Ведь изменил я значение переменной $k уже после определения функции, на которую ссылается $newF  smile 
У нас уже конешно  пять утра, но всё же smile


--------------------
MaXL
PM MAIL   Вверх
dva300
Дата 21.8.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



работа функции начинается в моент ее вызова. 
замыкание - возврат ссылки на функцию.
вызов $a->(11)
но перед этим копия лексических переменных уже сохроненна с измененным значением переменной $x.
--------------------
Участник движения Культура Вождения
PM   Вверх
Pfailed
Дата 21.8.2010, 10:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



$k внутри анонимной подпрограммы ссылается на $k внутри подпрограммы genFunc. Соответственно при вызове анонимной функции это самое $k равно значению  $k внутри genFunc.



--------------------
PM MAIL   Вверх
MaXL
Дата 21.8.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



dva300, Pfailed,  спасибо. Значит такое поведение действительно является правильным.


--------------------
MaXL
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.