LINUX.ORG.RU

[perl] как поиметь «функцию-объект»

 


0

0

Нужно нечто вроде того что в С++ можно реализовать как объект класса с перегруженным operator()

Например — пишу функцию которая ищет минимум некой функции:

sub find_minimum_via_direct_search { my $objective_function = shift; ............... }

то есть find_minimum получает аргумент $objective_function которая может быть ссылкой на функцию. Потом чтобы получить значение функции в точке $point мы можем написать $objective_function->($point)

Проблема в том что я не могу написать objective_function прямо как функцию — мне нужно добавить туда некий стейт. Глобальные переменные понятно не годятся. Можно передавать дополнительный аргумент для этой функции, но это тоже несимпатично. Как завернуть в одну переменную функцию+стейт и чтобы ее было естественно вызывать?

★★★★★

Замыканием? Вот простейший пример:

#!/usr/bin/perl

sub f {
 my $g = shift;
 $g->(5);
};

sub make_g {
 my $state = shift;
 return sub {
  return $_[0] + $x;
 };
};

$g = make_g(10);

$z = f($g);

print $z, "\n";

Jini ★★
()
Ответ на: комментарий от Jini

Упс, сначала набросал пример, потом хотел переписать в терминах первопоста, чтоб понятней было, потом решил вернуться к старому варианту. $state надо заменить на $x.

Jini ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.