2016-12-05 8 views
4

変数の入力値または実行時の値によって別の関数を定義できる場合は、読み書きが容易な関数を記述しています関数)。フルfunctionが... gためend構文はどちらか助けていません使用変数の値に応じて関数内の関数を定義する方法

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 

:以下は、(関数内の関数を定義すると、この単純な例ではありません有利であっても)の考えを示しています。

質問は次のとおりです。私はその警告を得るには間違ったことをしています。意図しない振る舞い、またはジュリアはこれを理由で許可していませんか?それができれば、どうですか?

N.B.私の現在の必要性のために、私はg1とg2という2つの異なる関数を定義することができます。 1つのタスクコンセプトのために多くのケースがある場合はどうなりますか?私はファーストクラスのオブジェクトであるファンクションは自由に操作できると考えました。変数に割り当てられ、条件に応じて定義され、条件によって上書きされます。

P.S.私はStringを作成して解析することができますが、それは醜い解決策です。

答えて

6

匿名関数を使用します。 This is a known issuethis other issue also shows your problem)。

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

v0.5では、匿名関数と汎用関数の間にパフォーマンスの違いはないため、匿名関数を使用しない理由はありません。

f = function (x) 
    x 
end 

、あなたが過負荷に呼び出しを介してディスパッチを追加することができます:

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

はので、ここで無名関数を使用しない理由はありませんが、拡張匿名関数のためのsytnaxもありますので注意してください。

関連する問題