2016-12-05 3 views
4

Ich schreibe eine Funktion, die ich einfacher schreiben und lesen könnte, wenn sie abhängig von Eingabe- oder Laufzeitwerten von Variablen eine andere Funktion definieren könnte (und diese dann verwenden) Funktion). Im Folgenden wird die Idee (auch wenn in einer Funktion eine Funktion definieren, die in diesem einfachen Beispiel keinen Vorteil ist): entwederWie definiere ich eine Funktion innerhalb einer Funktion in Abhängigkeit von Variablenwerten?

julia> function f(option::Bool) 
      if option 
       g() = println("option true") 
       g() 
      else 
       g() = println("option false") 
       g() 
      end 
     end; 
WARNING: Method definition g() in module Main at REPL[1]:3 overwritten at REPL[1]:6. 

julia> f(true) 
option false 

julia> f(false) 
ERROR: UndefVarError: g not defined 
in f(::Bool) at .\REPL[1]:7 

Mit der vollen function ... end Syntax für g hilft nicht.

Die Frage ist: mache ich etwas falsch, um diese Warnung und dieses unbeabsichtigte Verhalten zu bekommen, oder Julia erlaubt dies nicht aus einem Grund? Und wenn es möglich ist, wie?

N.B. Für mein gegenwärtiges Bedürfnis kann ich einfach zwei verschiedene Funktionen definieren, g1 und g2, und es scheint zu funktionieren; aber was wäre, wenn es viele Fälle von g für nur ein Aufgabenkonzept gäbe? Ich dachte, dass eine Funktion, die ein Objekt der ersten Klasse ist, frei gehandhabt werden kann: einer Variablen zugewiesen, die in Abhängigkeit von den Bedingungen definiert oder überschrieben wird, usw.

P.S. Ich weiß, dass ich einen String komponieren und dann analysieren kann, aber das ist eine hässliche Lösung.

Antwort

6

Sie möchten anonyme Funktionen verwenden. This is a known issue (this other issue also shows your problem).

function f(option::Bool) 
      if option 
       g =() -> println("option true") 
      else 
       g =() -> println("option false") 
      end 
     g 
     end 

In v0.5 gibt es keinen Unterschied in der Leistung zwischen anonymen und allgemeinen Funktionen, also gibt es keinen Grund, nicht anonyme Funktionen zu verwenden. Beachten Sie, dass es gibt auch eine sytnax für erweiterte anonyme Funktionen:

f = function (x) 
    x 
end 

und Sie können Depeschen über Anrufüberlastung hinzufügen:

(T::typeof(f))(x,y) = x+y 

so gibt es keinen Grund, nicht eine anonyme Funktion hier zu verwenden.

Verwandte Themen