Отключить анонимную функцию от файла, в котором она определена - PullRequest
3 голосов
/ 06 октября 2019

Я ищу обходной путь для следующей проблемы:

  • Создание сценария foo.m, содержащего fun = @(x)(x*x)
  • Выполнение foo. Это создает переменную fun.
  • Удалить foo.m
  • Попробуйте запустить fun(2).

В последних версиях MATLAB (я использую R2019b)это приводит к ошибке:

Ранее доступный файл "foo.m" теперь недоступен.

Почему-то анонимная функция связана с файлом, в котором она была

Можно ли как-нибудь "отсоединить" его, чтобы он продолжал работать даже после удаления файла?


Для тех, кому интересно, зачем мне это нужно, он предназначен для fixing MATLink, интерфейс Mathematica / MATLAB, для последних версий MATLAB.

1 Ответ

3 голосов
/ 06 октября 2019

Вы можете использовать func2str и str2func, чтобы создать новый дескриптор функции, который будет работать:

more_fun = str2func(func2str(fun));
more_fun(2)

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

Редактировать: только что найдено (задокументированное) ограничение: если анонимная функция использует внешние переменные, этот методне будет работать, потому что

Дескрипторы функций, созданные с использованием str2func, не имеют доступа к переменным вне своей локальной рабочей области или к вложенным функциям. Если ваш дескриптор функции содержит эти переменные или функции, MATLAB® выдает ошибку при вызове дескриптора.

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