2017-04-06 2 views
3

Kann auf die in einer anderen Funktion in julia definierte Funktion zugegriffen werden? Zum Beispiel:Zugriffsfunktion in einer anderen Funktion definiert

julia> function f(x) 
     function g(x) 
      x^2 
     end 
     x * g(x) 
     end 

f (generic function with 1 method) 

julia> f(2) 
8 

julia> f.g(2) 
ERROR: type #f has no field g 
in eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:64 
in macro expansion at ./REPL.jl:95 [inlined] 
in (::Base.REPL.##3#4{Base.REPL.REPLBackend})() at ./event.jl:68 
+6

Nicht, es sei denn, Sie geben es zurück oder haben einen Zeiger auf es im Bereich definiert, wo Sie es verwenden möchten. –

+0

Sie können eine Funktion * return * zurückgeben, die in einer anderen Funktion definiert ist. Ist das wonach Sie suchen? Geben Sie beispielsweise die anonyme Funktion x-> x * g (x) in Ihrem Beispiel zurück. –

Antwort

5

No. In julia, ist es oft ideomatic ein Modul für lokale Funktionen zu nutzen

module F 
function g(x) 
    x^2 
end 

function f(x) 
    x * g(x) 
end 

export f 
end 

using F 

f(2) 
F.g(2) 

Was ist der Anwendungsfall? Sie können einen benutzerdefinierten Typ definieren, ihm ein Funktionsfeld zuweisen und dann den Typ aufrufbar machen (eine Schließung), um das gewünschte Verhalten zu erzielen. Aber ob das der beste Weg ist, Ihr Problem in Julia zu lösen, ist eine andere Frage.

+1

Anstatt zu sagen "Aber ob das der beste Weg ist, Ihr Problem in Julia zu lösen, ist eine andere Frage." Sie könnten einfach sagen "Aber das ist wahrscheinlich nicht der beste Weg, um Ihr Problem zu lösen." Ich denke, hier unklug zu sein, ist es wert, wild zu sein, weil es ein mäßig verbreiteter Newcomer-Fehler ist, zu denken, dass sie OO in Julia so umsetzen können. (Und sie sind nicht falsch, als solche. Aber Sie wissen, wie unidiomatisch solcher Code wäre, bin ich mir sicher.) –

+0

@LyndonWhite ja, guter Punkt. Das meinte ich. –

+2

@LyndonWhite, nur für das Lachen, aber, überprüfen Sie diesen Beitrag und die Antwort von Jeff B: http://StackOverflow.com/Questions/39133424/How-to-create-a-Single-dispatch-objektorientierte- Klasse-in-Julia-das-Verhalten-l –

1

Sie können dies tun, wenn Ihre Funktion f eine Instanz einer aufrufbaren Typ ist, eine Funktion g als begehbares Feld enthält:

julia> type F 
     g::Function 
     end 

julia> function(p::F)(x)  # make type F a callable type 
     x * p.g(x) 
     end 

julia> f = F(function (x) return x.^2 end) # initialise with a function 
F(#1) 

julia> f(2) 
8 

julia> f.g 
(::#1) (generic function with 1 method) 

Wenn g ist immer eine feste Funktion, dann können Sie es einführen über ein interner Konstruktor.

Aber um Lyndons Kommentare oben zu wiederholen, ist eine bessere Frage, warum würdest du das tun, anstatt etwas, das sich mehr auf die dynamischen Versandfunktionen von Julia verlässt?

Verwandte Themen