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

Я только что обнаружил, что при вызове 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.


person Pyrolistical    schedule 17.03.2009    source источник
comment
Я решил это, просто добавив префикс к моим файлам .m, я не ожидал найти хорошее решение этой проблемы, я просто смотрел, есть ли вообще какие-либо ответы   -  person Pyrolistical    schedule 25.03.2009


Ответы (2)


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

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

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

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

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

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

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

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

person gnovice    schedule 17.03.2009

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

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

person Jason S    schedule 18.03.2009
comment
У меня такое ощущение, что порядок приоритета функций по-прежнему применяется к получению дескрипторов функций (т. е. дескриптор может по-прежнему указывать на метод Java, а не на перегруженный метод OPs.m). Хотя я не совсем уверен. - person gnovice; 18.03.2009
comment
Я проверил документацию (mathworks.com/access/helpdesk/help). /techdoc/ref/)... Когда вы оцениваете перегруженную функцию с помощью ее дескриптора, аргументы, с которыми оценивается дескриптор, определяют реальную функцию, которую MATLAB отправляет. Будь ты проклят, Мерфи! знак равно - person gnovice; 18.03.2009