2016-05-03 3 views
1

Ich habe so etwas wie die folgendenJulia passiert optionale Parameter zur inneren Funktionsaufruf

function test(; testvar=nothing) 
    # only pass testvar to function if it has a useful value 
    inner_function(testvar != nothing ? testvar2=testvar : # leave it out) 
end 

# library function, outside my control, testvar2 can't be nothing 
function inner_function(; testvar2=useful value) 
    # do something 
end 

Ich weiß, dass ich verwenden können, wenn/else-Anweisungen innerhalb test() aber inner_function viele Parameter haben, so würde ich das von einem vermeiden bevorzugen Code-Duplizierungs-Standpunkt. Ist das möglich?

Hinweis:inner_functionnicht haben testvar2 = nothing, wenn testvar2 geben wird es einen gültigen Wert haben muss.

+0

Sie könnten die Variablen in ein Array oder ein Wörterbuch einfügen und "nichts" herausfiltern. Ist das die Art von was du meinst? –

+0

Wie übergebe ich diese dann an 'innere_funktion' als Schlüsselwort = Argumentpaare? Denn das möchte ich erreichen. – tlnagy

+1

@Higany Sie können '...' verwenden, um Schlüsselwortargumente zu übergeben, wie 'innere_funktion (; filter ((x, y) -> y! = Nichts, args) ...)' –

Antwort

1

Wie @elsuizo hervorhebt, ist Multiple Dispatch eines der Kernelemente von julia, mit dem Sie solche Operationen durchführen können. Suchen Sie ein kurzes Beispiel unten:

>>> inner_func(x) = true; 
>>> inner_func(::Type{Void}) = false; 

Hinweis: es scheint Nothing zu Void umbenannt wurde (als Warnung aufgefordert, wenn ich versuche, es zu benutzen).

inner_func hat 2 Methodendefinitionen, wenn Void als Parameter übergeben wird, wird die Funktion nur zurückgeben false (dieses Verhalten nichts tun, indem ändern oder was auch immer Sie tun mögen). Wenn die Funktion stattdessen etwas anderes als Void empfängt, wird nur etwas anderes ausgeführt (in diesem Fall geben Sie true zurück).

Ihre test würde überhaupt keine Überprüfung durchführen müssen. Übergeben Sie einfach die Parameter an die inner_func, und es wird entscheiden, was zu tun ist (welche der 2 Methoden der Funktion inner_func aufrufen) abhängig von dem Parametertyp.

Ein Beispiel:

>>> a = [1, 2, 3, Void, 5]; 
>>> filter(inner_func, a) 
4-element Array{Any,1}: 
1 
2 
3 
5 

für die numerischen Elemente ruft die Funktion die Methode der der Funktion, die true zurückkehrt, und somit werden die numerischen Elemente zurückgegeben. Für das Element Void wird die zweite Methode der Funktion aufgerufen, die false zurückgibt und somit kein solches Element zurückgibt.