Nano Hash - криптовалюты, майнинг, программирование

Возможно ли, чтобы управляемая локальная переменная прозрачно перемещалась в другую локальную область?

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

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

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

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

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

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

10.11.2011

  • Ваша идея использования захвата переменных будет работать, но похоже, что она будет более сложной и непрозрачной, чем просто передача параметров. Для вашего пути вам нужно будет передать anon func. Как бы это реально помогло. 10.11.2011
  • "How to pass a result value from a function without using any parameters or function result?": Как бы это выглядело, даже в псевдокоде, если предположить, что что-то волшебное существует? Бесполезный ответ на актуальный вопрос: используйте глобальные переменные. 10.11.2011
  • Какую проблему вы пытаетесь решить здесь? В общем, такие скрытые зависимости (что метод B зависит от метода A, вызываемого первым) обычно являются помехой, когда дело доходит до понимания кода и последующего изменения. 10.11.2011
  • Хм, я почему-то думал, что смогу решить это одним звонком. Я просто хочу прозрачную сборку мусора для своего списка. Это все. 10.11.2011
  • @HeinrichUlbricht, я рекомендую использовать явное уничтожение, это гораздо менее подвержено ошибкам и на самом деле не так уж сложно. Просто используйте FreeandNil(MyObject);, когда закончите. Используйте блок try .. finally, чтобы убедиться, что уничтожение произошло. 10.11.2011
  • Я согласен с Йоханом. Delphi не собирает мусор: игнорирование этого факта плывет против течения, это будет сложно, хакерски и трудно читать. Лучше используйте верный и проверенный способ Delphi: явное выделение, попытка, наконец, явное уничтожение. 10.11.2011
  • Я: ребята правы. Мозг: icanhascheezburger.com/2007/09/25/screw-dis -не хочет 10.11.2011
  • Вы можете использовать интерфейс: он подсчитывает ссылки, поэтому он будет автоматически уничтожен, когда вы перестанете его использовать. Просто помните, что нельзя смешивать ссылки на объекты и интерфейсы на один и тот же объект — ссылайтесь на конкретный объект только через один или другой. 10.11.2011
  • Весь смысл функций L и O, совместно использующих значения переменных, включая управляемые типы, заключается в том, что вызывающий/вызываемый имеют явное отношение из-за списка параметров в вызове от вызывающего к вызываемому. Уничтожать это нечестиво. Если им нужно чем-то поделиться, сделайте их обычными методами внутри класса, каждый экземпляр этого класса содержит свое состояние, а затем освободите сам объект, когда последний его пользователь выйдет из области видимости (TInterfacedObject). Определенно не делайте такие методы методами вашей формы. 10.11.2011
  • @Warren Нет, форма просто из быстро созданного тестового проекта. Я никогда не сделаю это частью моей формы! 11.11.2011

Ответы:


1

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

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

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

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

См. здесь подробное объяснение: >Как и когда перехватываются переменные, на которые ссылаются анонимные методы Delphi?

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

10.11.2011
  • Звучит как богатый источник ошибок. Спасибо за ссылку! Я отпущу его и быстро закрою. 10.11.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..