Возможно ли, чтобы управляемая локальная переменная прозрачно «переходила» к другой локальной области? - PullRequest
2 голосов
/ 10 ноября 2011

Этот вопрос относится к моему другому , и я надеюсь получить от него некоторые идеи:

Возможно ли, чтобы локальная управляемая переменная (запись, интерфейс, ...) контролировала локальную область и «переходила» к другой без использования каких-либо явных параметров out / var или значений результата?

Извините, если это звучит странно, но это позволило бы мне создать управляемый объект внутри вызываемого метода, который будет уничтожен, только когда закончится вызывающий метод, а не тот, который он был создан, в то время как весь процесс полностью прозрачен для вызывающей стороны (это главная цель). Абонент не должен ничего объявлять.

Первая хакерская идея приходит сюда:

(Mis-) Использовать автоматически созданный объект-обертку для анонимных методов и прикреплять к нему данные. Мое предположение таково: этот объект создается в локальной области вызывающих абонентов, живет во время локальной области вызываемых абонентов (чтобы вызываемый объект мог прикреплять к нему данные) и действует до end; вызывающего абонента.

Можно ли прикрепить данные к этому объекту-обертке? Помимо хакерства: есть ли шанс работать?

Редактировать : Может быть, проще сформулировать вопрос: «Как передать значение результата из функции без использования каких-либо параметров или результата функции?»

Edit2 : Написание некоторого кода заставляет меня задуматься, должен ли я его отпустить:

function TForm1.L<T>(Func: TFunc<T>):T;
var
  Value: T;
begin
  Result := Func;

  // now attach something to the anon wrapper of Func
end;

function TForm1.O<T>(Value: T): T;
begin
  Result := T;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  List: TList;
begin
  for Item in L(O<TList>(List)) do
  begin

  end;

  // List should be destroyed here
end;

Я думаю, что должен.

1 Ответ

4 голосов
/ 10 ноября 2011

Извините, если это звучит странно, но это позволило бы мне создать управляемый объект внутри вызываемого метода, который будет уничтожен только после завершения вызывающего метода, а не того, в котором он был создан. Таким образом, у меня нет использовать переменные out / var или возвращаемые значения (что фактически является моей целью).

Управляемая локальная переменная из метода CALLED должна, ну, "переместиться" к вызывающему методу. Единственные определенные методологии для чего-то подобного - это использовать var, out или возвращать фактическое значение. Это потому, что все «управляемые» типы данных, которые можно «транспортировать», подсчитываются по ссылкам. Это включает в себя интерфейсы и строки.

Используйте автоматически созданный объект-оболочку для анонимных методов и прикрепите к нему данные. Мое предположение: этот объект создается в локальной области вызывающих, живет во время локальной области вызываемых (так что вызываемый может прикреплять к нему данные) и действует до конца; вызывающего абонента.

Delphi генерирует фактические TInterfacedObject потомки для анонимных методов. Он генерирует ОДИН такой потомок для каждого метода / процедуры, который объявляет анонимные методы. Имя сгенерированного объекта будет основано на имени процедуры, в которой объявлен анонимный метод. У этих объектов есть методы, один метод для каждого используемого анонимного метода. Он также имеет поля данных: одно поле для каждой локальной переменной, используемой в анонимном методе, плюс ссылку на объект, с которым вы работаете.

Подробное объяснение см. Здесь: Как и когда регистрируются переменные, на которые ссылаются анонимные методы Delphi?

Идея состоит в том, что вы можете прикрепить поля данных к анонимному методу, просто объявив локальные переменные в той же процедуре, что и анонимный метод, и используя их в этом анонимном методе. После этого вы сможете получить эти данные, но это будет хакерский, сложный способ: вам нужно будет привести анонимный метод к реализующему объекту (анонимный метод на самом деле является интерфейсом, так что это можно сделать ). Тогда вам нужно будет использовать RTTI, чтобы получить доступ к полям, содержащим ваши данные. Не кажется мне очень полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...