2 Stimmen

Wie vermeidet man Zweideutigkeiten beim Aufruf von Java aus Matlab?

Ich habe gerade entdeckt, dass beim Aufruf von Java aus Matlab

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

ist gleichbedeutend mit

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

Das Problem dabei ist, dass ich auch eine method.m das eine Übersetzung von Java nach Matlab vornimmt (z. B. Konvertierung String[] zur Zelle der Strings). Mein method.m sieht aus wie

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

Was passiert, ist, wenn ich method(object, arg1,...,argn) wird ein direkter Java-Aufruf durchgeführt, anstatt dass ich meine method.m

Die Lösung ist einfach, verwenden Sie einfach nicht den gleichen Methodennamen für meine Java-Methoden und meine .m Dateien. Aber gibt es einen anderen Weg? Wie kann ich wissen, welche Methode bei gleichem Namen aufgerufen wird? Gibt es eine Möglichkeit, sicherzustellen, dass ich method.m anstelle der Java-Methode? Es ist einfach, einen Aufruf der Java-Methode sicherzustellen, verwenden Sie einfach die object.method Syntax.

Nebenbei bemerkt, ist es auch dumm, dass die .m Editor verweist auf die method.m über die method(object, arg1,...,argn) aufruft, während es beim Debuggen die Java-Methode aufruft.

3voto

gnovice Punkte 124264

Möglicherweise gibt es Probleme mit der Art und Weise, wie MATLAB das Dispatching durchführt...

Woher weiß ich, welche Methode mit demselben Namen aufgerufen wird?

Dieser Abschnitt der MATLAB-Dokumentation wird erläutert, wie eine Funktion ausgewählt wird, wenn es mehrere Funktionen mit demselben Namen gibt. Aus der Dokumentation: "Die Rangfolge der Funktionen bestimmt den Vorrang einer Funktion vor einer anderen, basierend auf dem Typ der Funktion und ihrer Position im MATLAB-Pfad." Diese Reihenfolge (vom höchsten zum niedrigsten Wert) ist im Folgenden angegeben:

  • Unterfunktion
  • Private Veranstaltung
  • Klasse Konstruktor
  • Überladene Methode
  • Funktion im aktuellen Verzeichnis
  • Funktion an anderer Stelle des Pfades

Die Platzierung Ihrer "method.m"-Funktion wird wahrscheinlich bestimmen, ob sie aufgerufen wird oder die Java-Methode aufgerufen wird, wenn Sie die "method(object,...)"-Syntax verwenden.

Kann ich sicherstellen, dass ich method.m anstelle der Java-Methode aufrufe?

Im Moment gehe ich davon aus, dass sich Ihre "method.m" im aktuellen Verzeichnis oder an einer anderen Stelle des Pfades befindet (die beiden Positionen mit der niedrigsten Priorität). Wenn Sie "method.m" zu einem Unterfunktion in dem größeren Code, der sie aufruft, oder ob es möglich ist, sie in eine privates Verzeichnis wo sie von jeder Funktion, die sie aufrufen muss, aufgerufen werden kann, dann kann sie aufgerufen werden anstelle von die Java-Methode, wenn Sie die Syntax "method(object,...)" verwenden.

Ich hoffe, das hilft!

1voto

Jason S Punkte 178087

Hmmmmmmmmm.... Sie könnten versuchen, ein Funktionshandle zu erhalten, indem Sie @method und rufen dann feval() auf dem Funktionshandle.

Das könnte funktionieren, aber ich bin mir nicht sicher....

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X