Wenn kein Parametertyp vorhanden ist, hat er "defaults"

8

Ich möchte im Wesentlichen Folgendes tun:

%Vor%

Das heißt, erlauben Sie einem Benutzer, an meine Funktion CVODE_BDF zu übergeben und, wenn sie keinen der Typparameter gesetzt haben, interpretieren Sie sie als CVODE_BDF{:Newton,:Dense} . Ich weiß, dass typealias nicht wirklich funktioniert, aber gibt es eine Möglichkeit, dies zu simulieren? Wie in der Funktion, lesen Sie T.parameters[1] und irgendwie sehen, dass es leer war?

    
Chris Rackauckas 18.11.2016, 23:12
quelle

4 Antworten

4

Sie können dies tun, wenn die Funktion Objekte dieses Typs anstelle des Typs selbst akzeptiert. ZB

%Vor%

gibt

%Vor%     
David P. Sanders 19.11.2016, 02:06
quelle
4

Eine Möglichkeit besteht darin, die Typparameter ( {:Newton,:Dense} ) über Konstruktoren .

Hier ist ein Beispiel für den in Julia definierten rationalen Zahlentyp (rational.jl):

%Vor%

In Ihrem Beispiel könnten Sie eine Konstruktorfunktion in Ihrer CVODE_BDF -Typdefinition definieren und nach den Typen suchen und auf {:Newton,:Dense} zurückgreifen, wenn sie nicht gesetzt sind.

    
tamasgal 19.11.2016 08:52
quelle
3

Würde so etwas für Sie funktionieren?

%Vor%

Funktionsimplementierung:

%Vor%

Wrapper, die die Standardwerte festlegen:

%Vor%

Ergebnis:

%Vor%

Da der letzte Aufruf etwas hässlich ist, sind Objekte wahrscheinlich die bessere Wahl, wenn maximale Flexibilität benötigt wird. Darüber hinaus können Konstruktoren Einschränkungen für die Parameter erzwingen, sodass sie in der Funktion nicht überprüft werden müssen.

Bearbeiten:

Wenn Ihre Funktion mehr als ein Argument hat, ist das Hinzufügen von Methoden für jede Kombination von Parametern zu viel Arbeit. Stattdessen kann man für jeden Typ eine Standardmethode definieren (zur Verdeutlichung nur einen Parameter):

%Vor%

Bei einer aktuellen Nacht hat dies keinen Laufzeitaufwand:

%Vor%     
tim 19.11.2016 19:37
quelle
1

Ja, es gibt. Wenn Sie Type{CVODE_BDF} ausführen, können Sie die Parameter des resultierenden Objekts überprüfen. Wenn CVODE_BDF 'leer' ist, wird ein CVODE_BDF -Typ mit generischen Parametern zurückgegeben, andernfalls werden sie die spezifischen verwendet.

Beispiel (mit Array , da ich CVODE_BDF handy nicht habe):

%Vor%

Beispielfunktion:

%Vor%

%Vor%     
Tasos Papastylianou 19.11.2016 21:42
quelle

Tags und Links