Как избежать двусмысленности при вызове Java из Matlab?

StackOverflow https://stackoverflow.com/questions/656014

Вопрос

Я только что обнаружил, что при вызове Java из Matlab

object.method(arg1,...,argn)

эквивалентно

method(object, arg1,...,argn)

Проблема в том, что у меня тоже есть method.m это выполняет некоторый перевод с Java в Matlab (например.конвертировать String[] в ячейку строк).Мой method.m выглядит как

function result = method(object, arg1,...argn)
  intermediate = object.method(arg1,...argn);
  result = translate(intermediate);

Что происходит, когда я звоню method(object, arg1,...,argn), он выполняет прямой вызов Java вместо того, чтобы использовать свой method.m

Исправить это легко, просто не используйте одно и то же имя метода для моих методов Java и для моего метода. .m файлы. Но есть ли другой путь?Как узнать, какой метод будет вызываться с тем же именем?Есть ли способ гарантировать, что я позвоню method.m вместо метода Java? Обеспечить вызов метода Java легко, просто используйте object.method синтаксис.

В качестве примечания, что также глупо, так это то, что .m Редактор ссылается на method.m на method(object, arg1,...,argn) вызов, а при отладке он вызывает метод Java.

Это было полезно?

Решение

Возможно, у вас возникнут проблемы с тем, как MATLAB выполняет диспетчеризацию...

Как узнать, какой метод будет вызываться с тем же именем?

Эта секция документации MATLAB обсуждается, как выбирается функция в случаях, когда существует несколько функций с одинаковым именем.Из документации:«Порядок приоритета функции определяет приоритет одной функции над другой на основе типа функции и ее расположения на пути MATLAB». Этот порядок (от максимального до самого низкого) приведен ниже:

  • Подфункция
  • Частная функция
  • Конструктор класса
  • Перегруженный метод
  • Функция в текущем каталоге
  • Функция в другом месте пути

Размещение вашей функции «method.m», скорее всего, будет определять, будет ли она вызываться или будет вызываться метод Java при использовании синтаксиса «метод (объект,...)».

Есть ли способ гарантировать, что я вызываю метод.m вместо метода Java?

Прямо сейчас я предполагаю, что ваш «method.m» находится в текущем каталоге или где-то еще на пути (две позиции с самым низким приоритетом).Если вы сделали "method.m" подфункция в более крупном коде, вызывающем его, или, если возможно, поместить его в личный каталог где он может быть вызван каждой функцией, которая должна его вызвать, тогда он может быть вызван вместо метод Java при использовании синтаксиса «метод(объект,...)».

Надеюсь это поможет!

Другие советы

Хммммммммм .... вы можете попробовать получить дескриптор функции с помощью @method, а затем вызвать feval() в дескрипторе функции.

Это может сработать, но я не уверен ....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top