Как избежать двусмысленности при вызове Java из Matlab? - PullRequest
2 голосов
/ 18 марта 2009

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

Ответы [ 2 ]

3 голосов
/ 18 марта 2009

У вас могут возникнуть проблемы с диспетчеризацией MATLAB ...

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

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

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

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

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

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

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

1 голос
/ 18 марта 2009

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

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

...