Как я могу лениво загрузить переменную Perl? - PullRequest
4 голосов
/ 25 сентября 2010

У меня есть переменная, которую я должен передать подпрограмме.Вполне возможно, что подпрограмме не понадобится эта переменная, и предоставление значения для переменной стоит дорого.Можно ли создать объект с отложенной загрузкой, который будет оцениваться только в том случае, если он действительно используется?Я не могу изменить саму подпрограмму, поэтому она должна выглядеть как обычный скалярный Perl для вызывающей стороны.

Ответы [ 4 ]

6 голосов
/ 25 сентября 2010

Вы захотите посмотреть на Data :: Lazy и Scalar :: Defer . Обновление: Также есть Данные :: Thunk и Scalar :: Lazy .

Я сам не пробовал ничего из этого, но я не уверен, что они правильно работают для объекта. Для этого вы можете попробовать класс Moose , который хранит реальный объект в атрибуте lazy , который handles всех методов, предоставляемых этим объектом. (Это не сработает, если подпрограмма выполнит проверку isa, если только она не вызовет isa в качестве метода, и в этом случае вы можете переопределить ее в своем классе.)

5 голосов
/ 25 сентября 2010

Data::Thunk - самый прозрачный и надежный способ сделать это, о котором я знаю.

Однако я не большой поклонник этого или любых других подобных модулей или методов, которые пытаются скрыть себя от пользователя. Я предпочитаю что-то более явное, например, когда в коде используется значение, которое трудно вычислить, просто вызовите функцию для его получения. Таким образом, вам не нужно предварительно вычислять ваше значение, ваше намерение более четко видно, и вы также можете иметь различные варианты, чтобы избежать повторного вычисления значения, например, лексические замыкания, переменные состояния perl или модули типа Memoize.

2 голосов
/ 25 сентября 2010

Вы можете посмотреть на связывание .

1 голос
/ 25 сентября 2010

Я бы предложил отступить и переосмыслить, как вы структурируете свою программу.Вместо передачи переменной в метод, который ей может не понадобиться, сделайте это значение доступным другим способом, например, вызовом другого метода, который можно вызывать по мере необходимости (а не тогда, когда это не так).

В Moose такие данные идеально хранятся в атрибутах.Вы можете создавать атрибуты лениво, чтобы они не вычислялись до тех пор, пока они не потребуются в первый раз, но после этого значение сохраняется, поэтому его не нужно вычислять во второй раз.

...